WCF hosting: Can access svc file but cannot go to wsdl link

Viewed 35007

I have a WCF service that is hosted in IIS 7.5. I have two servers, one for test and one for production.

The service works fine on test server, but on the production server I have the following error.

When I access the address http://..../service.svc I can see the default page that says:


You have created a service.

To test this service, you will need to create a client and use it to call the service. You can do this using the svcutil.exe tool from the command line with the following syntax:

svcutil.exe http://..../service.svc?wsdl

This will generate a configuration file and a code file that contains the client class. Add the two files to your client application and use the generated client class to call the Service.


But when I click the wsdl link, I cannot go to the wsdl page. It returns me to this default web page without any errors. I am suspecting a network/firewall authorization error but does anybody have an experience like this one?

All IIS settings are the same for test and production servers.

Thank you, Best Regards.

4 Answers

You basically need three things to enable browsing to your WSDL for a WCF service:

  1. a service behavior which enables service metadata
  2. set the httpGetEnabled=True on that service metadata behavior to allow http browsing to that metadata
  3. a mex endpoint on your service

So your config on the server side might looks something like this (plus a bit more stuff):

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MetadataBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service behaviorConfiguration="MetadataBehavior" name="YourService">
        <endpoint address="" 
                  binding="basicHttpBinding" 
                  contract="IYourService" />
        <endpoint address="mex" 
                  binding="mexHttpBinding" 
                  contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

Points 1 and 2 are handled by this line here:

<serviceMetadata httpGetEnabled="true" />

You need to reference that service behavior in your <service> tag for it to become active.

Point 3 (MEX endpoint) is this section here:

<endpoint address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange" />

For http, use the mexHttpBinding, and the IMetadataExchange contract is a WCF system contract for metadata exchange .

Related