Клиент Silverlight, использующий службу WCF, выбрасывает систему.ServiceModel.Исключение CommunicationException

#c# #wcf #silverlight #nettcpbinding #clientaccesspolicy.xml

#c# #wcf #silverlight #привязка nettcpbinding #clientaccesspolicy.xml

Вопрос:

Пожалуйста, потерпите меня, поскольку я новичок в службах WCF / службах Windows. Я создал службу WCF, размещенную в службе Windows. Я хочу использовать службу WCF в приложении Silverlight в браузере. Ниже приведен фрагмент кода в Silverlight для доступа к службе WCF:


             var messageEncoding = new BinaryMessageEncodingBindingElement();
            var tcpTransport = new TcpTransportBindingElement();
            var binding = new CustomBinding(messageEncoding, tcpTransport);

            // Create a channel factory for the service endpoint configured with the custom binding.
            var cf = new ChannelFactory<ICalcService>(binding, new EndpointAddress("net.tcp://192.168.2.104:4508"));

            // Open the channel.
            ICalcService channel = cf.CreateChannel();

            // Invoke the method asynchronously.
            channel.BeginAdd(9, 5, AddCallback, channel);
  

     private void AddCallback(IAsyncResult asyncResult)
    {
        try
        {
            double endAdd = ((ICalcService) asyncResult.AsyncState).EndAdd(asyncResult);
        }
        catch (Exception exception)
        {
            throw exception;
        }
    }
  

Я мог бы использовать службу WCF без каких-либо исключений в другом локальном приложении, отличном от silverlight. Но в Silverlight он выдает исключение System.ServiceModel.Исключение CommunicationException со следующим сообщением:

 Could not connect to net.tcp://192.168.2.104:4508/. The connection attempt lasted for a time span of 00:00:00.1010058. TCP error code 10013: An attempt was made to access a socket in a way forbidden by its access permissions.. This could be due to attempting to access a service in a cross-domain way while the service is not configured for cross-domain access. You may need to contact the owner of the service to expose a sockets cross-domain policy over HTTP and host the service in the allowed sockets port range 4502-4534.
  

Внутреннее исключение типа System.Net.Sockets.Исключение SocketException говорит

 An attempt was made to access a socket in a way forbidden by its access permissions.
  

Поиск в Google подсказал мне такие решения, как отключение брандмауэра, добавление следующих тегов в ClientAccessPolicy.xml :

   <grant-to>
    <socket-resource port="4502-4534" protocol="tcp" />
  </grant-to>
  

К сожалению, ни одно из решений мне не помогло. Я полагаю, что эта проблема связана с ClientAccessPolicy.xml . Я подозреваю, что мне не хватает, чтобы поместить ClientAccessPolicy.xml в нужном месте. Я сохранил его в корне службы WCF. Будет ли это работать для NetTcpBinding? Если ClientAccessPolicy.xml не является виновником, что может быть причиной этого исключения?

Ответ №1:

Избавился от исключения ..!! Я добавил следующий атрибут перед внедрением службы:

     [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  

Также я удалил режим безопасности при указании привязки следующим образом:

 var netTcpBinding = new NetTcpBinding(SecurityMode.None);