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 の既定の Web サイト ルートとwwwroot. また、すべてのファイアウォールをオフにしました。ポリシーは athttp://localhost/clientaccesspolicy.xml とat で確認できますhttp://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>

誰か提案はありますか?この厄介なエラーには、これまで何日もかかりました。どんな助けでも大歓迎です。

編集

フィドラーを使用して Web セッションで取得されているファイルを確認すると、ブラウザーがクライアント アクセス ポリシー ファイルを取得していることがわかるので、エラーは別の場所にあり、WCF がこのエラーをスローしていると思いますか? また、閉じるたびにキャッシュをクリアするようにIE9を設定しました。以下をご覧ください。

ここに画像の説明を入力

4

2 に答える 2

3

さて、私はそれを機能させることができました。言及する価値のあるいくつかのポイントは次のとおりです。

1.私が上に投稿したエラー(サービス アドレスを次のように指定したときに Visual Studio によって生成されたもの) を見ると、netTcp ポートがエンド ポイントの一部として生成されていないことがわかります。 TCP エラー 10016 ( ) と TCP エラー 10013 。ServiceReferences.ClientConfighttp://localhost/Conference/VideoConferenceService.svc4502EndpointNotFoundExceptionServiceReferences.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:*していましたが、次のようにポート範囲として指定する必要がありました。

ここに画像の説明を入力

localhost:80/ClientAccessPolicy.xmlまた、収集した情報によると、Silverlight はクライアント アクセス ポリシー ファイルを検索するため、サービスをホストする Web サイトはポート 80 にある必要があります。

記録のために、これと同じ問題に出くわした人のために、これ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.configまた、IISのポートやベース アドレスを指定する必要がないことにも注意してください。ポートを使用してサービス エンドポイントを作成します4502。4503、4522 などに変更してみましたが、興味深いことに、これらのポートでは機能せず、4502 でのみ機能しました。

于 2012-05-26T13:07:22.417 に答える
0

元の投稿で指定されているのと同様の問題がありました。上記の解決策で問題を解決できなかった人を助けるために、サービスをホストしているマシンの Windows ファイアウォールが、net.tcp に接続しようとしていたポートをブロックしていることを発見しました。そのソフトウェア ファイアウォールのポートを通過するトラフィックを許可すると、サービスが期待どおりに機能し始めました。

net.tcp に 4502 ~ 4530 の範囲を許可するために、ハードウェア ファイアウォールもチェックする価値があるかもしれません。

于 2013-10-02T10:30:13.077 に答える