Wcf – configuring web.config (system.serviceModel) for a site which talks to multiple web services (some through dlls)

asp.netconfigurationwcfwcf-configurationweb.config

I've a solution which consists of a web project and a class library project. The web project solution directly references a wcf service. There is a 2nd wcf service, but it is the class library project which directly references it. I'm adding the class library (output) as reference to my web project.

Hence in my web project's web.config I now have two scf services configured. This process was easy since I had manually copied the app.config (system.serviceModel part) directly to the web.config, and then configured the web project to talk directly with another wcf service (directly, not through any dlls).

My web project needs to talk to a 3rd web service (asmx). Again I plan to bring this as a class library and include the dll into my web project. (This is a separate solution). When I took a look at this particular class lib project's app.config, I thought i just copy those necessary sections and merge it correspondingly with my current web.config.

So for the 3rd class lib project (which references the asmx service) I happened to notice that it had, under the bindings node, a node called basicHttpBinding, and next, a customBinding. Then further under the client node, there were two endpoint nodes which had the service attributes. (I don't understand why there should be two end points here first of all).

So I copied what came under the bindings node (from the 3rd class lib prj app.config) and appended it to the bindings node (in the web.config). I did a similar process for copying the end points too. But now when I try run the web site I get an exception which halts at the time of initializing the soap client (asmx service): it says something like its not able to determine the endpoint for this contract.

The web.config before I add the asmx web service looks like this:

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_IEmployeeService" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
          maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
          textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
            enabled="false" />
          <security mode="Message">
            <transport clientCredentialType="Windows" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
              algorithmSuite="Default" />
          </security>
        </binding>
        <binding name="WSHttpBinding_IHelper" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
          maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
          textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
            enabled="false" />
          <security mode="Message">
            <transport clientCredentialType="Windows" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
              algorithmSuite="Default" />
          </security>
        </binding>
      </wsHttpBinding>      
    </bindings>
    <client>
      <endpoint address="http://localhost:8731/Design_Time_Addresses/InfiniumIS/EmployeeService/"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IEmployeeService"
        contract="InfiniumWS.IEmployeeService" name="WSHttpBinding_IEmployeeService">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <endpoint address="http://localhost:8732/Design_Time_Addresses/SQLIS/Service1/"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IHelper"
        contract="SQLIS.IHelper" name="WSHttpBinding_IHelper">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>

Below is the service model for the project with the asmx service (taken from app.config)

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="ServiceSoap" 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="Transport">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
            <binding name="ServiceSoap1" 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>
        <customBinding>
            <binding name="ServiceSoap12">
                <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
                    messageVersion="Soap12" writeEncoding="utf-8">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                </textMessageEncoding>
                <httpsTransport manualAddressing="false" maxBufferPoolSize="524288"
                    maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
                    bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                    keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
                    realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                    useDefaultWebProxy="true" requireClientCertificate="false" />
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint address="https://is.security/WebAppSec_WS/service.asmx"
            binding="basicHttpBinding" bindingConfiguration="ServiceSoap"
            contract="apps.intranet.ws.ServiceSoap" name="ServiceSoap" />
        <endpoint address="https://is.security/WebAppSec_WS/service.asmx"
            binding="customBinding" bindingConfiguration="ServiceSoap12"
            contract="apps.intranet.ws.ServiceSoap" name="ServiceSoap12" />
    </client>
</system.serviceModel>

I simply merged the sections – meaning copied whatever coming in the 2nd config under the binding node, and appened it to the 1st one. I did a similar process for copying the endpoints.

ps: I have no clue why the 2nd config (asmx) is showing me two endpoints?

Best Answer

The ASMX endings use two different bindings. The first binding is HTTP whereas the second binding is HTTPS. Assuming the ASMX service supports both HTTP and HTTPS, you should be able to delete one of the endpoints from the client configuration.