WCF通过TCP托管多个端点

时间:2014-08-01 13:01:14

标签: c# .net wcf sockets tcp

我有问题在WCF上托管多个端点,它给了我错误:

  

System.ServiceModel.AddressAlreadyInUseException:已经有了   IP端点上的监听器   0.0.0.0:808。如果有另一个应用程序已在此端点上侦听,或者您有多个服务端点,则可能会发生这种情况   在具有相同IP端点但具有不兼容性的服务主机中   绑定配置。 ---> System.Net.Sockets.SocketException:仅   每个套接字地址(协议/网络地址/端口)的一种用法是   通常在system.Net.Sockets.Socket.DoBind(EndPoint   endPointSnapshot,SocketAddress socketAddress)

我的App.config

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <appSettings>
        <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
        <add key="ClientSettingsProvider.ServiceUri" value="" />
      </appSettings>
      <system.web>
        <compilation debug="true" />
        <membership defaultProvider="ClientAuthenticationMembershipProvider">
          <providers>
            <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
          </providers>
        </membership>
        <roleManager defaultProvider="ClientRoleProvider" enabled="true">
          <providers>
            <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
          </providers>
        </roleManager>
      </system.web>

      <system.serviceModel>
        <diagnostics wmiProviderEnabled="true">
          <messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
        </diagnostics>

        <bindings>
          <netTcpBinding>
            <binding name="TCPDefault" portSharingEnabled="true" />
          </netTcpBinding>
        </bindings>
        <services>
         <!--Service1-->
          <service name="WCFLibrary.CalculatorService" behaviorConfiguration="DebugBehavior">
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp://localhost/CalculatorService" />

              </baseAddresses>
            </host>
            <endpoint address="" binding="netTcpBinding" bindingConfiguration="TCPDefault"
              name="ServiceTCPEndPoint" contract="WCFLibrary.ICalculator">
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
           <endpoint address="mex" binding="mexTcpBinding" name="ServiceMexEndPoint"
              contract="IMetadataExchange" />
         </service>
         <!--Service2-->
          <service name="WCFLibrary.MyWorldService" behaviorConfiguration="DebugBehavior">
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp://localhost/MyWorldService" />

              </baseAddresses>          
            </host>
            <endpoint address="" binding="netTcpBinding" bindingConfiguration="TCPDefault"
          name="WCFLibrary.MyWorldService" contract="WCFLibrary.IMyWorld">
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexTcpBinding" name="ServiceMexEndPoint"
               contract="IMetadataExchange" />          
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="DebugBehavior">

              <serviceMetadata/>

              <serviceDebug includeExceptionDetailInFaults="True" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>

I'm having separate services with callbacks. Please advise.

**Modified App.config**

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
    <add key="ClientSettingsProvider.ServiceUri" value="" />
  </appSettings>
  <system.web>
    <compilation debug="true" />
    <membership defaultProvider="ClientAuthenticationMembershipProvider">
      <providers>
        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
      </providers>
    </membership>
    <roleManager defaultProvider="ClientRoleProvider" enabled="true">
      <providers>
        <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
      </providers>
    </roleManager>
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <diagnostics wmiProviderEnabled="true">
      <messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
    </diagnostics>

    <bindings>
      <netTcpBinding>
        <binding name="TCPDefault" portSharingEnabled="true" />
      </netTcpBinding>
    </bindings>
    <services>
     <!--Service1-->
      <service name="WCFLibrary.CalculatorService" behaviorConfiguration="DebugBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost/CalculatorService" />

          </baseAddresses>
        </host>
        <endpoint address="" binding="netTcpBinding" bindingConfiguration="TCPDefault"
          name="ServiceTCPEndPoint" contract="WCFLibrary.ICalculator">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
       <endpoint address="net.tcp://localhost:8002/CalculatorService/mex" binding="mexTcpBinding" name="ServiceMexEndPoint"
          contract="IMetadataExchange" />
     </service>
     <!--Service2-->
      <service name="WCFLibrary.MyWorldService" behaviorConfiguration="DebugBehavior">
        <host>
          <baseAddresses>
            <!--<add baseAddress="net.tcp://localhost/MyWorldService" />-->

          </baseAddresses>          
        </host>
        <endpoint address="net.tcp://localhost/MyWorldService" binding="netTcpBinding" bindingConfiguration="TCPDefault"
      name="WCFLibrary.MyWorldService" contract="WCFLibrary.IMyWorld">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="net.tcp://localhost:8001/MyWorldService/mex" binding="mexTcpBinding" name="ServiceMexEndPoint"
           contract="IMetadataExchange" />          
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DebugBehavior">
          <!-- To avoid disclosing metadata information, 
          set the values below to false before deployment -->
          <!--<serviceMetadata httpGetEnabled="False" httpsGetEnabled="False" />-->
          <serviceMetadata/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

WCF:

  

http://pastebin.com/gHHRKeYZ

WindowsService:

  

http://pastebin.com/kjM3iRYj

2 个答案:

答案 0 :(得分:2)

问题在于您的MEX端点 - 它们在两个服务之间是相同的。尝试给他们不同的地址,看看这是否能解决问题。

答案 1 :(得分:0)

我的第一个猜测是你有另一个应用程序监听某个端口尝试将端口更改为这样的东西

尝试不同的端口
  <add baseAddress="net.tcp://localhost:2200/CalculatorService" />
 <add baseAddress="net.tcp://localhost/MyWorldService:2200" />

如果成功,请尝试使用此命令列出所有应用和侦听端口

netstat -an