在 WCF 的添加服务引用中找不到 net.tcp 端点?

Posted

技术标签:

【中文标题】在 WCF 的添加服务引用中找不到 net.tcp 端点?【英文标题】:Can't find net.tcp endpoint in add service reference in WCF? 【发布时间】:2015-03-06 18:11:12 【问题描述】:

我有 WCF 和 net.tcp 绑定的常见问题。 我也看到 *** 上的所有帖子也在谷歌上搜索..

我无法向客户端添加服务引用的主要问题。 我得到错误:

Could not find a base address that matches scheme net.tcp for the endpoint with binding NetTcpBinding. Registered base address schemes are [http]. 

    我使用的是 IIS 7。我检查了非 HTTP。我在启用协议 net.tcp 中添加到网站,还将 net.tcp 添加到绑定中。如果我点击浏览(http)我的地址。我看到我的文件夹带有 WCF 应用程序,如果我选择 svc 文件,我会看到正常地址:

    svcutil.exe net.tcp://MYADDRESS/Service.svc/mex

如果我看到这个 URL,我猜我的 IIS 设置正确!!

但是当我尝试添加对客户端的引用时,问题就开始了。只有我看到 http 端点,没有 net.tcp。

这是我的服务配置:

<?xml version="1.0"?>
<configuration>

      <appSettings>
        <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
      </appSettings>
      <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5"/>
      </system.web>
      <system.serviceModel>
        <services>
          <service name="MYSERVICE.SERVICE" behaviorConfiguration="behavior1">
            <endpoint 
                      binding="netTcpBinding"
                      contract="MYSERVICE.ISERVICE"> 
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp://localhost:60745/MYSERVICE/SERVICE/"/>
              </baseAddresses>
            </host>
          </service>
        </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="behavior1">
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="netTcpBinding" scheme="net.tcp" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

注意:我的网站从 60745 地址开始,但是对于 IIS 中的 net.tcp 绑定,我添加了 60746:* 我还为两个端口打开了入站出站规则。

谢谢!

【问题讨论】:

您是否在 IIS 服务器上的 Windows 功能中开启了“Windows Communication Foundation Non-HTTP Activation”? 如果您的程序是 .NET 4.5,您是否在 .NET Framework 4.5 高级服务中打开了 TCP 激活(如果您运行 IIS 的操作系统有) 这是什么意思?我的服务 TCP 激活器和端口共享正在工作。我找不到这个 TCP 激活。第一次听说 我通过了 TCP 激活。 那我没主意了,抱歉 :( 【参考方案1】:

根据您在 cmets 中提到的问题,我自己也运行它,添加服务参考的 gui 不能很好地处理 mexTcpBinding

您可以将 HTTP mex 用于元数据,并且仍将 net.tcp 用于您的数据通道。这是我的一个项目中的一个示例,它使用带有 http mex 的 tcp 通道。

  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NetTcpConfig" closeTimeout="00:30:00" openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00" transferMode="Streamed"
          maxReceivedMessageSize="67108864">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="AsyncStreaming">
          <dispatcherSynchronization asynchronousSendEnabled="true"/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceCredentials>
            <serviceCertificate findValue="Example" x509FindType="FindBySubjectName"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="Server.Endpoints.ExampleEndpoint">
        <endpoint address="" behaviorConfiguration="AsyncStreaming" binding="netTcpBinding" bindingConfiguration="NetTcpConfig" contract="Server.IExample"/>
        <endpoint address="" behaviorConfiguration="AsyncStreaming" binding="netTcpBinding" bindingConfiguration="NetTcpConfig" contract="Server.IExample2"/>
        <endpoint address="" behaviorConfiguration="AsyncStreaming" binding="netTcpBinding" bindingConfiguration="NetTcpConfig" contract="Server.IExample3"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <protocolMapping>
        <add binding="netTcpBinding" scheme="net.tcp" bindingConfiguration="NetTcpConfig"/>
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <diagnostics wmiProviderEnabled="false">
      <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true"
        maxMessagesToLog="3000"/>
    </diagnostics>
  </system.serviceModel>

【讨论】:

以上是关于在 WCF 的添加服务引用中找不到 net.tcp 端点?的主要内容,如果未能解决你的问题,请参考以下文章

WCF - 在合同列表中找不到合同名称

如何对我的 WCF 客户端类进行单元测试?

WCF net.tcp 服务和 SQL Server 中的存储程序集

找不到 WCF 合同名称“IMyService”?

WCF over net.tcp 与安全模式 none 给出异常

WCF Net.tcp 仅在本地失败