2

想知道是否有人可以让我摆脱跨域策略的地狱。

我有一个使用 的双工 WCF 服务,netTcpBining客户端是 Silverlight 4 应用程序。当我自己托管服务时,它可以完美运行,我的 Silverlight 客户端可以毫无问题地使用该服务。但是,当我在 IIS 7 中托管它时,问题就开始了。当我在 IIS 中托管它时,我可以在以下位置看到该服务:

http://localhost/Conference/VideoConferenceService.svc

当我添加对托管在 IIS 中的服务的引用并尝试调用它时,我得到:

CommunicationException:无法连接到 net.tcp://localhost/Conference/VideoConferenceService.svc。连接尝试持续了 00:00:03.3071892 的时间跨度。TCP 错误代码 10013:尝试以访问权限禁止的方式访问套接字。这可能是由于尝试以跨域方式访问服务而未将服务配置为跨域访问. 您可能需要联系服务的所有者以通过 HTTP 公开套接字跨域策略,并将服务托管在允许的套接字端口范围 4502-4534 中。

或者,如果看到实际错误有助于激发那些以前看过它的人,这就是它向我抛出的内容Reference.cs

在此处输入图像描述

我已经检查了几乎所有关于解决跨域策略错误的解决方案,并且我已经将我clientaccesspolicy.xml的默认网站根目录放在 IIS 中,也放在wwwroot. 我还关闭了所有防火墙。我可以看到该政策,http://localhost/clientaccesspolicy.xmlhttp://127.0.0.1/clientaccesspolicy.xml我仍然收到此错误。

这是我在 IIS 7 中托管的服务的 web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <runtime>
    <gcServer enabled="true" />
  </runtime>

  <system.web>
    <compilation debug="false" />
  </system.web>
   <system.serviceModel>
     <services>
       <service name="VideoServer.VideoConferenceService">
         <endpoint address="" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IVideoConferenceService" contract="VideoServer.IVideoConferenceService" />
         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
         <host>
           <baseAddresses>
                <add baseAddress="net.tcp://localhost:4502/VideoServer/" />
           </baseAddresses>
         </host>
       </service>
     </services>

    <bindings>
      <netTcpBinding>
        <binding name="NetTcpBinding_IVideoConferenceService" portSharingEnabled="true" transactionFlow="false" transferMode="Buffered" listenBacklog="2147483647" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="2147483647" maxReceivedMessageSize="2147483647" closeTimeout="24.20:31:23.6470000" openTimeout="24.20:31:23.6470000" receiveTimeout="24.20:31:23.6470000" sendTimeout="24.20:31:23.6470000">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <reliableSession enabled="false" />
          <security mode="None">
            <message clientCredentialType="None" />
            <transport protectionLevel="None" clientCredentialType="None" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="False" />
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
    <system.webServer>
        <directoryBrowse enabled="true" />
    </system.webServer>

</configuration>

这是 Silverlight 客户端的ServiceReferences.ClientConfig文件:

<configuration>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="NetTcpBinding_IVideoConferenceService">
                    <binaryMessageEncoding />
                    <tcpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost/Conference/VideoConferenceService.svc"
                binding="customBinding" bindingConfiguration="NetTcpBinding_IVideoConferenceService"
                contract="ServiceReference1.IVideoConferenceService" name="NetTcpBinding_IVideoConferenceService" />
        </client>
    </system.serviceModel>
</configuration>

有人有什么建议吗?到目前为止,这个烦人的错误已经花费了我几天的时间。任何帮助将不胜感激。

编辑

当我使用 fiddler 检查在我的网络会话中检索到的文件时,它显示我的浏览器正在检索客户端访问策略文件,所以我认为错误出在其他地方,WCF 只是向我抛出了这个错误?我还设置了 IE9 以在每次关闭时清除其缓存。看看下面。

在此处输入图像描述

4

2 回答 2

3

好吧,我只是设法让它工作。值得一提的几点是:

1.如果您查看我在上面发布的错误 ServiceReferences.ClientConfig(当我将服务地址指定为时由 Visual Studio 生成http://localhost/Conference/VideoConferenceService.svc:),您可以看到 netTcp 端口4502不是作为端点的一部分生成的,这就是导致的原因TCP 错误 10016 ( EndpointNotFoundException) 以及 TCP 错误 10013。ServiceReferences.ClientConfig is实际上正确的是:

<configuration>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="NetTcpBinding_IVideoConferenceService">
                    <binaryMessageEncoding />
                    <tcpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost:4502/Conference/VideoConferenceService.svc"
                binding="customBinding" bindingConfiguration="NetTcpBinding_IVideoConferenceService"
                contract="ServiceReference1.IVideoConferenceService" name="NetTcpBinding_IVideoConferenceService" />
        </client>
    </system.serviceModel>
</configuration>

2.当我在 IIS 7 中托管我的服务时,我将端口范围808:*作为 netTcp 端口,而我应该4502:*将端口范围作为端口范围,如下所示:

在此处输入图像描述

同样从我收集的信息来看,托管服务的网站应该在端口 80 上,因为 Silverlight 将查找localhost:80/ClientAccessPolicy.xml客户端访问策略文件。

只是为了记录,对于那些偶然发现同样问题的人,这web.config设法在 IIS 中工作:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="false" />
  </system.web>

   <system.serviceModel>
     <services>
       <service name="VideoServer.VideoConferenceService">
         <endpoint address="" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IVideoConferenceService" contract="VideoServer.IVideoConferenceService" />
         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
       </service>
     </services>

    <bindings>
      <netTcpBinding>
        <binding name="NetTcpBinding_IVideoConferenceService" portSharingEnabled="false" transactionFlow="false" transferMode="Buffered" listenBacklog="2147483647" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="2147483647" maxReceivedMessageSize="2147483647" closeTimeout="24.20:31:23.6470000" openTimeout="24.20:31:23.6470000" receiveTimeout="24.20:31:23.6470000" sendTimeout="24.20:31:23.6470000">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <reliableSession enabled="false" />
          <security mode="None">
            <message clientCredentialType="None" />
            <transport protectionLevel="None" clientCredentialType="None" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True" />
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
    <system.webServer>
        <directoryBrowse enabled="true" />
    </system.webServer>
</configuration>

另外值得注意的是,您不需要在web.configIIS 中放置任何端口或基地址。它将使用端口创建服务端点4502,我尝试将其更改为 4503、4522 等,有趣的是它不适用于这些端口,仅适用于 4502。

于 2012-05-26T13:07:22.417 回答
0

我们遇到了与原始帖子中指定的类似问题。只是为了帮助无法使用上述解决方案解决问题的任何人,我们发现托管该服务的计算机上的 Windows 防火墙阻止了我们尝试通过 net.tcp 连接的端口。一旦我们允许流量通过该软件防火墙上的端口,我们的服务就开始按预期工作。

可能值得检查您可能拥有的任何硬件防火墙,以允许我相信 net.tcp 的范围为 4502-4530

于 2013-10-02T10:30:13.077 回答