Клиент Silverlight, использующий службу WCF, генерирует исключение System.ServiceModel.CommunicationException
Пожалуйста, потерпите меня, потому что я нуб в службах 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.
Поиск в Интернете предложил мне решения, такие как отключение брандмауэра, добавление следующих тегов в 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);