Silverlight и WCF: debugging или как понять ошибку сервиса

WPF, MVVM, Silverlight | создано: 21.02.2011 | опубликовано: 21.02.2011 | обновлено: 13.01.2024 | просмотров: 5277

Довольно часто при написании Silverlight-приложений с использованием WCF-сервисов (в том числе и RIA-сервисов) при запросе на сервер в ответ приходит сообщение типа: "The remote server returned an error: Not Found". И просто так понять о чем идет речь, или о чем сервер пытается намекнуть программисту просто невозможно. Я расскажу как решается проблема отладки.

Итак, хотелка

Хочу понимать присланные сервером сообщения об ошибках.

Включение отладки

Вариант 1:

Visual Studio имеет кучу настроек, не обошла команда разработчиков и такую важную тему как отладка (debugging). В настройках проекта сайта (host для silverlight-приложения) легко заметить закладку Web, в которой в самом низу можно найти раздел Debuggers.

настройки проекта

Можно включить и выключить отладку Silverlight. Но стоит заметить, что Вы не сможете одновременно использовать отладку Silverlight и Host (сайт), на котором запускается silverlight-приложение, если Silverlight-приложение не браузере, а вне его (Out-Of-Browser OOB). В случаи OOB, одновременно можно отлаживать либо сайт (например, WCF-сервисы), либо Silverlight-приложение.

Вариант 2:

Можно запустить отладку использую полезную функцию Visual Studio, которая называется Attach to process (Ctrl+Alt+P). То есть подключится непосредственно к процессу (к браузеру) в котором исполняется silverlight-приложение:

подключение к процессу

Чтобы определить к какому экземпляру подключится можно посмотреть на тип: Type =Silverlight 86.

Конфигурация WCF-сервиса

В web.config надо тоже внести некоторые изменения. Они не большие но очень важные. Чтобы ваш сервис смог с вами "общаться" в файле конфигурации должна быть включена соответствующая настройка:

<serviceDebug includeExceptionDetailInFaults="true" />

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

И, наконец, еще одна настройка

Чтобы Вы смогли получать сообщения на стороне silverlight-приложения, надо "сказать" приложению и в частности сервису, что все запросы к нему идут через http протокол. То есть, сделать так, чтобы сервис думал что его опрашивает web-сайт, а не silverlight. Для этого надо сделать следующее:

1) на странице, которая обращается к сервису (например, MainPage.xaml.cs) добавить пространства имен:

using System.Net;
using System.Net.Browser;

2) в конструкторе этой самой страницы (например, MainPage.xaml.cs) написать код:

WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

После отладки можно смело удалить эту строку. Она больше не понадобится. И, собственно говоря, на этом всё.

Дополнительно:

MSDN: Debugging Services for Silverlight Applications