2

我正在尝试从 IIS 中运行两个 WCF 服务,一个是 Web 服务,一个是 Net TCP 绑定服务。

这是我的 Web.config 的同义词(我已经匿名化了服务名称):

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

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="ServerService">
        <endpoint address="ServerService" 
                  binding="netTcpBinding" 
                  bindingConfiguration="" 
                  name="NetTcpEndPoint" 
                  contract="IServerService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8523/"/>
            <add baseAddress="htt://localhost:8523/"/>
          </baseAddresses>
        </host>
      </service>

      <service name="MyWebService">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration=""
                  name="AACCWSEndPoint"
                  contract="IMyWebService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8523/IMyWebService"/>
          </baseAddresses>
        </host>
      </service>

    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- 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="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

当我在 IDE 中运行它时,它会打开一个在端口 51953 上运行的页面,我可以通过浏览http://localhost:51953/WebService.svc?wsdl来获取 Web 服务的 WSDL (注意端口不同)。我似乎无法通过将端口更改为我在 webconfig 文件 (8523) 中指定的端口来获取 WSDL。

当我将 WcfTestClient 应用程序指向“net.tcp://localhost:8523/ServerService”时,它给了我一个错误,说它无法访问元数据,据我所知,我已经配置了(第二个服务的终点)。

我在这里做错了什么?

更新:

我尝试按照建议将项目属性上的端口号更改为 8523,但这似乎不起作用,我还尝试将 mex 端点的地址更改为“ServerService\mex”,测试客户端花了一些时间搅动但是然后它抛出了以下错误:

错误:无法从 net.tcp://localhost:8523/ServerService 获取元数据 如果这是您有权访问的 Windows (R) Communication Foundation 服务,请检查您是否已在指定地址启用元数据发布。有关启用元数据发布的帮助,请参阅位于 http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange 错误 URI:net.tcp://localhost:8523/ServerService 元数据包含的 MSDN 文档无法解析的引用:'net.tcp://localhost:8523/ServerService'。您尝试为不支持 .Net 框架的服务创建通道。您可能会遇到 HTTP 端点。预期的记录类型“PreambleAck”,发现“72”。

我会继续挖掘,但我会很感激任何帮助。

更新 2:

我已将 mex 端点更改为 mexTcpBinding:这是服务标签:

    <endpoint address="ServerServiceWS"
              binding="wsHttpBinding"
              bindingConfiguration=""
              name="WSEndPoint"
              contract="IServerService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex"
              binding="mexTcpBinding"
              contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8523/"/>
        <add baseAddress="http://localhost:8523/"/>
      </baseAddresses>
    </host>
  </service>

仍然没有运气。为了确保我在测试仪中输入了正确的 url,我使用的 Url 是:

net.tcp://localhost:8523/ServerService

我也试过:

net.tcp://localhost:8523/mex

net.tcp://localhost:8523/

所有这些都给了我以下错误的一些变化:

错误:无法从 net.tcp://localhost:8523/ServerService 获取元数据 如果这是您有权访问的 Windows (R) Communication Foundation 服务,请检查您是否已在指定地址启用元数据发布。有关启用元数据发布的帮助,请参阅位于 http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange 错误 URI:net.tcp://localhost:8523/ServerService 元数据包含的 MSDN 文档无法解析的引用:'net.tcp://localhost:8523/ServerService'。您尝试为不支持 .Net 框架的服务创建通道。您可能会遇到 HTTP 端点。预期的记录类型“PreambleAck”,发现“72”。

更新 3

FWIW 我认为我的 WEb.config 可能存在更大的问题这是它目前的样子:

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

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="ServerService">
        <endpoint address="" 
                  binding="netTcpBinding" 
                  bindingConfiguration="DefaultBindingConfig" 
                  name="NetTcpEndPoint" 
                  contract="IServerService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>

        <endpoint address="mex"
                  binding="mexTcpBinding"
                  contract="IMetadataExchange" 
                  bindingConfiguration="mexBinding"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8523/"/>
          </baseAddresses>
        </host>
      </service>

      <service name="MyWebService">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration=""
                  name="MyWSEndPoint"
                  contract="IMyWebService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange"
                  bindingConfiguration="mexHttpBinding"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8523/MyWebService"/>
          </baseAddresses>
        </host>
      </service>

    </services>
    <bindings>
      <netTcpBinding>
        <binding name="DefaultBindingConfig"
                 maxConnections="5"
                 portSharingEnabled="true" >
        </binding>
        <binding name="mexBinding"
                 portSharingEnabled="true">
          <security mode="None"></security>
        </binding>
      </netTcpBinding>
      <mexTcpBinding>
        <binding name="mexTcpBinding"/>
      </mexTcpBinding>
      <mexHttpBinding>
        <binding name="mexHttpBinding"/>
      </mexHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServerServiceBehaviour">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true" />
          <!-- 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="false"/>
        </behavior>
        <behavior name="MexBehaviour">
          <serviceMetadata httpGetEnabled="true" policyVersion="Policy15"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

我可以浏览到 Web 服务,这允许我使用 ?wsdl 获取 WSDL,但是如果我将地址http://localhost:8523/MyWebService放入 WCF 测试器,它也会引发错误。

错误:无法从http://localhost:8523/MyWebService获取元数据 如果这是您有权访问的 Windows (R) Communication Foundation 服务,请检查您是否已在指定地址启用元数据发布。有关启用元数据发布的帮助,请参阅位于 http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error URI: http://localhost:8523/MyWebService Metadata contains a reference的 MSDN 文档无法解决:'http://localhost:8523/MyWebService'。接收对http://localhost:8523/MyWebService的 HTTP 响应时出错. 这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是由于服务器中止了 HTTP 请求上下文(可能是由于服务关闭)。有关更多详细信息,请参阅服务器日志。底层连接已关闭:接收时发生意外错误。无法从传输连接读取数据:现有连接被远程主机强行关闭。远程主机强制关闭现有连接HTTP GET 错误 URI: http://localhost:8523/MyWebService 下载“http://localhost:8523/MyWebService”时出错。请求失败,HTTP 状态为 404:未找到。

我认为这个问题要么与路径有关,要么我只是将错误的 URL 放入测试应用程序中。要么,要么我还没有正确配置元数据。

4

3 回答 3

5

对于 HTTP 端点,如果使用 IIS Express 托管,您需要重新配置项目属性,以便它在端口 8523 处启动 web.config 定义的端点。使用特定端口 (8523) 而不是自动分配的端口 (51953)。

对于 TCP 元数据,您需要支持启用 TCP 的 mex 端点 ( mexTcpBinding)。

<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
于 2012-04-25T13:36:43.700 回答
1

必须在 IIS 上的不同端口上设置 net.tcp 和 HTTP 绑定。它可以用相同的端口或不同的端口进行测试。它会在第一种情况下崩溃。此外,您可以使用任何您想要的端口号。在这种情况下,可以将 TCP 端口更改为 8524。只是不能在同一个端口上使用两个单独的协议。另一方面,基地址仅对自托管服务有意义。这里的基地址由来自 IIS 的 URL 确定。

于 2017-01-11T08:58:55.610 回答
0

只需尝试保持原样,并更改您的服务并将其粘贴到您的配置文件中,它应该可以完美运行。要测试 net.tcp,您可以使用 SvcUtil.exe

       <system.serviceModel>
<services>
  <service name="MyWCFServices.HelloWorldService">
    <endpoint
         binding="netTcpBinding"
         bindingConfiguration="ultra"
         contract="MyWCFServices.IHelloWorldService"/>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"  />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8086/HelloWorldService.svc" />
        <add baseAddress="http://localhost:8081/HelloWorldService.svc" />
      </baseAddresses>
    </host>
  </service>
</services>
<bindings>
  <netTcpBinding>
    <binding name="ultra"
         maxBufferPoolSize="2147483647"
         maxBufferSize="2147483647"
         maxReceivedMessageSize="2147483647"
         portSharingEnabled="false"
         transactionFlow="false"
         listenBacklog="2147483647" >
      <security mode="None">
        <message clientCredentialType="None"/>
        <transport protectionLevel="None" clientCredentialType="None"/>
      </security>
      <reliableSession enabled="false"/>
    </binding>
  </netTcpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
于 2017-07-04T12:21:57.667 回答