Код ошибки 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