2012-05-26 9 views
2

Было интересно, если кто-нибудь сможет вытащить меня из моей адвентистской политики.Код ошибки 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:

enter image description here

Я проверил почти все решение, предложенное в отношении решению ошибка междоменной политики, и я поместил свой 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> 

Кто-нибудь есть какие-нибудь предложения? Эта досадная ошибка заняла дни моего времени. Любая помощь будет принята с благодарностью.

EDIT

Когда я проверяю файлы быть извлечено в моих веб-сессий с помощью скрипача, он показывает, что мой браузер извлечения файла политики клиентского доступа, поэтому я думаю, что ошибка лежит где-то еще и WCF просто бросая эту ошибку на меня? Я также устанавливаю IE9 для очистки своего кеша каждый раз, когда он закрывается. Взгляните ниже.

enter image description here

+1

Я хотел бы проверить, что ваш clientaccesspolicy запрашивается и не кэшируются, Я заметил, что эти файлы политики можно кэшировать агрессивно. Я бы очистил ваш кеш и посмотрел ваши запросы (используя сетевой монитор в инструментах разработчика IE9, Firebug, Fiddler и т. Д.), Чтобы увидеть, как клиентская политика извлекается вашим браузером. – Rus

+0

спасибо, попробуем это сейчас и посмотрим, что произойдет. –

+0

@ Rus, я сделал это, но, похоже, это не решило проблему. Я также установил, что мой браузер всегда очищает кеш. Я обновил свой ответ, буду благодарен, если вы можете взглянуть. –

ответ

3

Ну, я только что удалось получить его работу.Пара пунктов стоит упомянуть, что:

1. Если вы посмотрите на ошибочнымиServiceReferences.ClientConfig, что я написал выше (сгенерированный визуальной студии, когда я дал адрес службы, как: 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:* как диапазон портов, как показано ниже:

enter image description here

Кроме того, из чего я собрал сайт, на котором размещался сервис, должен быть на порту 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.

0

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

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