tags:

views:

28

answers:

2

I consider myself pretty expert at WCF but this has me stumped. I don't know if this is a .NET Framework 4/WCF 4 thing with it's automatic configuration or what but I am getting strange behavior. I basically have a WCF 4 WCF service hosted in IIS project. It all worked and then I went in and switched the config from basicHttpBinding to wsHttpBinding. I tried to Update the Service Reference in my consuming app and I get basicHttpBinding output in the generated config. So, of course, I dropped down and ran svcutil.exe aggainst the .svc file and same results. This is the config file (Blah substituted for name that I can't use in public):

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <authentication mode="Windows"></authentication>
    <identity impersonate="true"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpEndpointBinding">
          <security mode="Message">
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="Blah.Services.RONScheduler.BlahService.BlahDataServiceBehavior"
        name="Blah.Services.RONScheduler.FAMService">
        <endpoint address="BlahDataService" binding="wsHttpBinding" bindingConfiguration="WSHttpEndpointBinding"
          name="WSHttpEndpoint" contract="Blah.Services.RONScheduler.FAMService.IBlahDataService"> 
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Blah.Services.RONScheduler.BlahService.BlahDataServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

This is what I get generated out before I clean out the unncessary stuff:

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IBlahDataService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost/BlahService/BlahDataService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IBlahDataService"
                contract="IBlahDataService" name="BasicHttpBinding_IBlahDataService" />
        </client>
    </system.serviceModel>

As you can see it's as if it's ignoring the wsHttpBinding setting in the config. What gives?

+1  A: 

Have you checked your default protocol bindings, a new feature in WCF 4 ??

By default, they're in your machine.config, and should look like this:

<system.serviceModel>
   <protocolMapping>
      <add scheme="http" binding="basicHttpBinding" bindingConfiguration="" />
      <add scheme="net.tcp" binding="netTcpBinding" bindingConfiguration=""/>
      <add scheme="net.pipe" binding="netNamedPipeBinding" bindingConfiguration=""/>
      <add scheme="net.msmq" binding="netMsmqBinding" bindingConfiguration=""/>
   </protocolMapping>

So this kinda implies to me that if you're hitting a HTTP address, WCF 4 will use basicHttpBinding by default.

You can change those bindings in your own configs, if needed.

Found this in A Developer's Introduction to Windows Communication Foundation 4

marc_s
Right, I forgot about that. It seems like config should overide this no? You should be able to override the defqaualts with config or the whole config system is broken.
Sam Gentile
THe Guide says, " Or if you'd only like to override it within the scope of an application, you can override this section within your application/web configuration file. "
Sam Gentile
That's what is not working.
Sam Gentile
It's supposed to do this only in the abscence of configured endpoints like I have
Sam Gentile
@Sam Gentile: you're right - this should only apply if no binding is given.... hmm.... remains a mystery for now in that case!
marc_s
A: 

Given the configurations you provided, my guess would be that the service name is invalid and the host falls back to default configuration.

Make sure the service name matches the implementation class name.

I came to this conclusion because the interface name is Blah.Services.RONScheduler.FAMService.IBlahDataService and the class name is Blah.Services.RONScheduler.FAMService. It looks like there is something missing after FAMService.

Johann Blais