Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TCP承载多个端点的WCF_C#_.net_Wcf_Sockets_Tcp - Fatal编程技术网

C# 使用TCP承载多个端点的WCF

C# 使用TCP承载多个端点的WCF,c#,.net,wcf,sockets,tcp,C#,.net,Wcf,Sockets,Tcp,我在WCF上托管多个端点时遇到问题,这给了我错误: System.ServiceModel.AddressalReadyUseException:已存在一个 IP端点上的侦听器 0.0.0.0:808. 如果有另一个应用程序正在侦听此端点,或者您有多个服务端点,则可能会发生这种情况 在具有相同IP端点但不兼容的服务主机中 绑定配置。-->System.Net.Sockets.SocketException:仅限 每个套接字地址(协议/网络地址/端口)的一种用法是 通常允许在system.Net.

我在WCF上托管多个端点时遇到问题,这给了我错误:

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

WindowsService:


问题似乎出在您的MEX端点上——它们在两个服务之间是相同的。尝试为他们提供不同的地址,看看这是否解决了问题。

我的第一个猜测是,您有另一个应用程序在某个端口上侦听,请尝试将端口更改为类似的内容 在两个端口上尝试不同的端口

  <add baseAddress="net.tcp://localhost:2200/CalculatorService" />
 <add baseAddress="net.tcp://localhost/MyWorldService:2200" />

在我的例子中,我已经更新了.net framework,并且收到了这个错误。我通过删除配置文件中的listenBacklog和maxConnections属性来解决此错误


是解决我的问题的解决方案。

有了它,我可以让WCF与测试客户端一起运行。但是,当我在windows服务中托管此服务时,我无法使用svcutil下载元数据。您可以准确地发布您对.config文件的修改方式,以及尝试对该服务使用svcutil时收到的错误消息吗?请检查我的编辑。当我通过服务管理器运行服务时,我使用svcutil测试服务,它还下载元数据。它说:无法从网络获取元数据。tcp://localhost/CalculatorService. 第二个endpointAFischbein的解决方案也是如此,但由于它托管在windows服务中,因此我无法从svcutil下载元数据
netstat -an