Как обработать ошибку службы WCF в Silverlight, когда время сеанса аутентификации истекло - PullRequest
3 голосов
/ 11 февраля 2010

У меня есть служба WCF, к которой я обращаюсь в Silverlight. Приложение Silverlight требует аутентификации (аутентификация происходит через звонок в сервис).

Я заметил, что, когда время аутентифицированного сеанса истекает, и пользователь делает что-то на стороне приложения, которое будет делать вызов службе, приложение просто зависает, ожидая ответа службы. Мой сервис предназначен для вывода исключения в этих случаях, однако на стороне Silverlight ничего не назначается, а вместо этого выдается исключение:

CommunicationException не было обработано кодом пользователя

Удаленный сервер возвратил ошибку: NotFound.

В моих методах обслуживания я проверяю, аутентифицирован ли пользователь до сих пор, и если да, я продолжаю операцию. Если нет, я присваиваю значение параметру out (типа Exception). На стороне Silverlight я проверяю, является ли это исключение пустым, и в противном случае предпринимаю соответствующие действия. Когда я выполняю, параметр out получает правильное исключение, но затем Silverlight выдает вышеупомянутое исключение (в Reference.cs), прежде чем оно даже достигнет точки, где я смогу обработать это ...

Кто-нибудь еще видел это? Есть предложения?

Редактировать : Кажется, что наличие какого-либо исключения, в том числе наследования и их содержания, вызывает вышеуказанное исключение. Я нашел самый простой способ обойти это - просто передать информацию об исключении в свой собственный объект Exception (который, опять же, не может включать объект System.Exception)

Ответы [ 5 ]

0 голосов
/ 06 июля 2010

Посмотрите на мой ответ здесь:

Случайная ошибка «Не найдено» при доступе Silverlight к веб-службам ASP.NET

Это для службы asmx, но то же самое относится и к службе WCF. Ошибки WCF не передаются приложению silverlight. Он просто получает код состояния 404 из ответа.

0 голосов
/ 11 февраля 2010

Этот сайт, кажется, объясняет, что я испытываю: Общие сведения об услугах WCF в Silverlight

Очевидно, что Silverlight получит ошибку 400 для любого исключения, но не будет иметь большого понятия, что это за исключение.

Автор предлагает решение, но я немного растерялся, потому что исключения, которые я получаю, не выбрасываются, а просто присваиваются. Я думаю, что моя реализация будет работать ... кто-нибудь может дать какое-либо понимание?

0 голосов
/ 11 февраля 2010

Включите ведение журнала WCF в своей службе и посмотрите, что говорится в выводе. Обычно это гораздо более информативно, чем просто «NotFound». Вот некоторая информация о том, как настроить ведение журнала WCF:
http://msdn.microsoft.com/en-us/library/ms730064.aspx

0 голосов
/ 11 февраля 2010

Если не определено специальное поведение конечной точки для служб WCF, к которым вы обращаетесь (см. http://msdn.microsoft.com/en-us/library/dd470096(VS.95).aspx) сетевой стек браузера, преобразует ВСЕ исключения веб-службы в 404 - и это то, что вы наблюдаете.

Итак, у вас есть 2 варианта:

  • если вы можете изменить поведение служб WCF, вы можете добавить конечную точку, как описано по ссылке выше.
  • если вы не можете изменить поведение служб WCF, вы можете переключиться на сетевой стек клиента, добавив следующие строки в файл App.xaml.cs:

    HttpWebRequest.RegisterPrefix ("https://", WebRequestCreator.ClientHttp); HttpWebRequest.RegisterPrefix ("http://", WebRequestCreator.ClientHttp);`

Это обеспечит фактические ошибки в Silverlight, а не 404.

Очевидно, что переключение на клиентский сетевой стек имеет свои недостатки (например, вам придется самостоятельно обрабатывать аутентификацию, кэширование, файлы cookie)

0 голосов
/ 11 февраля 2010

Мысли и просьбы о дополнительной информации:

Вы проверили свою службу WCF для консольного приложения, и все работает как положено?

Вы можете звонить на службу WCF из приложения Silverlight, и это происходит только после истечения времени аутентифицированного сеанса?

Поддерживаете ли вы свое подключение к WCF в течение всего срока службы приложения Silverlight? Если так, я бы рекомендовал только открывать и закрывать его по мере необходимости. Таким образом, вы должны вызывать его только при аутентификации сеанса.

...