Search code examples
wcfwsdlmex

WCF Service, how do I tell if I am publishing WSDL or MEX?


It's my understanding that MEX and WSDL are two different ways of publishing metadata. In the interest of letting clients choose the one they prefer, I'd like to enable both. But I'm not entirely sure how.

My webconfig simply contains:

<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />

and when browsing to it shows that default page, with a link to serviceblahblah?wsdl which suggests I am publishing just the WSDL.

My question is, is this using MEX, if not how can I also publish MEX, and should I be publishing both?

I'm using the basichttpsbinding if that makes any difference.


Solution

  • and when browsing to it shows that default page, with a link to serviceblahblah?wsdl which suggests I am publishing just the WSDL.

    No, you are just visiting the WSDL. What else do you expect to see on that URL? ;-)

    The httpGetEnabled attribute enables the publishing of WSDL metadata. As shown in the mexHttpBinding documentation and Getting Started, if you want to expose MEX, you also have to expose a MEX endpoint you can then access:

    <!-- the mex endpoint is explosed[sic] at         
    http://localhost/servicemodelsamples/service.svc/mex -->
    
    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
    

    Clients, when discovering your service, will try to call the /mex endpoint first. If not found, they will request the WSDL. You can see this using Fiddler when you click "Add Service Reference" in Visual Studio and input the plain service URL, and I'm sure this behaviour documented somewhere.