Код ошибки TCP 10013 Ошибка междоменной политики со службой netTcpBinding и клиентом Silverlight

Было интересно, если кто-нибудь может вытащить меня из ада междоменной политики.

У меня есть дуплексный сервис 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.xmlа также в http://127.0.0.1/clientaccesspolicy.xml но я все еще получаю эту ошибку.

Вот мой web.config для службы, размещенной в IIS 7:

<?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 для очистки своего кэша каждый раз, когда он закрывается. Посмотрите ниже.

2 ответа

Решение

Ну, мне только удалось заставить это работать. Пара моментов, о которых стоит упомянуть:

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.config для IIS. Это создаст конечную точку сервиса, используя порт 4502Я попытался изменить его на 4503, 4522 и т. Д., И что интересно, он не работал с этими портами, только с 4502.

У нас была похожая проблема, как указано в исходном посте. Чтобы помочь тем, кто не смог решить проблему с помощью решений, представленных выше, мы обнаружили, что брандмауэр Windows на машине, на которой размещается служба, блокирует порт, через который мы пытались соединиться с помощью net.tcp. Как только мы пропустили трафик через порт на этом программном брандмауэре, наш сервис начал работать как положено.

Возможно, стоит проверить любой аппаратный брандмауэр, который у вас есть, чтобы разрешить диапазоны 4502-4530, которые я считаю для net.tcp

Другие вопросы по тегам