Проблема с доступом к службе WCF, размещенной на IIS, из приложения Windows - PullRequest
1 голос
/ 31 августа 2009

Я создал службу WCF с wsHttpBinding, которая использует провайдер членства asp.net для аутентификации. Я могу успешно разместить службу на сервере. Но моя проблема затуманена. (Я могу видеть файлы .svc и wsdl в браузере независимо от домена). Я могу использовать сервис только с моей машины или любой другой машины в том же домене. Если я пытаюсь получить доступ к службе из другого домена через приложение (Windows Appl.). Это дает мне сообщение об ошибке: -

«Объект связи, System.ServiceModel.Channels.ServiceChannel, нельзя использовать для связи, поскольку он находится в состоянии Failed»

Трассировка стека: Трассировка стека сервера: at System.ServiceModel.Channels.CommunicationObject.Close (TimeSpan timeout)

Исключение переброшено в [0]: в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & msgData, тип Int32) в System.ServiceModel.ICommunicationObject.Close (время ожидания TimeSpan) в System.ServiceModel.ClientBase 1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout) at System.ServiceModel.ClientBase 1.Close () в System.ServiceModel.ClientBase`1.System.IDisposable.Dispose () в AOLICWindows.Forms.SynchronizeTest.btnRegistration_Click (Отправитель объекта, EventArgs e)

1 Ответ

1 голос
/ 01 сентября 2009

wsHttpBinding по умолчанию использует учетные данные Windows для аутентификации, что нормально, если вы находитесь в одном домене или в домене с полными доверительными отношениями.

Похоже, что сообщение об ошибке указывает на тайм-аут - возможно, вам нужно настроить его. Если на вашем сервере возникает исключение, которое не обрабатывается должным образом и не превращается в ошибку SOAP, то канал (соединение между клиентом и сервером) становится «неисправным», например, оно переходит в состояние ошибки и больше не может быть использовано. Все, что вы можете сделать, это прервать канал (вы даже не можете больше его закрыть в этот момент) и заново создать его с нуля.

Или, может быть, этот тайм-аут произошел из-за того, что вы завернули использование прокси-клиента в блоке using(......) {......}? Обычно это отличная идея, но не в случае клиентского прокси WCF.

Проблема возникает из-за того, что, если канал неисправен, вы даже не можете его закрыть. Если вы включите использование клиентского прокси в оператор using (), когда на сервере что-то пойдет не так и будет обработано неправильно, произойдет сбой канала, и в конце блока using () среда выполнения .NET попытается закройте его, после чего вы получите еще одно исключение, так как канал неисправен ....

Так что для клиентов WCF рекомендуемая лучшая практика выглядит примерно так:

YourClientProxy proxy = new YourClientProxy();

try
{
   ... use it

   proxy.Close();
}
catch(TimeoutException exception)
{
   proxy.Abort();
}
catch(CommunicationException exception)
{
   proxy.Abort();
}

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...