?

Log in

Previous Entry | Next Entry


Суть проблемы


При использовании WCF-сервисов в Silverlight иногда возникает необходимость, например, отобразить текст серверной ошибки, или выполнить те или иные действия, зависимые от кода ошибки. При этом возникают проблемы с получением серверной ошибки. Дело в том, что SilverLight хостится в браузере, а браузер все ответы сервера с кодом, отличным от 200 (ok), заменяет на 404 (Not found), что приводит к тому, что SilverLight всегда получает ошибку "404 Not found" вместо той, которая реально возникла на сервере.

Два метода решения проблемы


1 - использование ClientHttp на клиентской стороне

Начиная с SilverLight 3.0 появилась возможность использовать Http запросы не через браузер, а с помощью встроенного в SilverLight Http-клиента (по умолчанию все запросы идут через браузер). Для этого необходимо перед первым запросом зарегистрировать префикс. Все запросы по URL, начинающиеся с этого префикса, будут идти через встроенный Http-клиент.
 

Вот эта магическая строчка кода (детали см. здесь):

var 
httpResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
Магия заключается в том, что встроенный клиент корректно обрабатывает http-коды, отличные от 200. Этот метод очень прост и не требует модификации серверной части, но в нем есть один недостаток. Дело в том, что если пользователь выходит в интернет через прокси, и в настройках прокси заданы логин/пароль, то встроенный http-клиент не может осуществить запрос. В результате возникает ошибка "407 Proxy Requires Authentication". На данный момент мне, к сожалению, не известно, как обойти эту ошибку. Если кто-то владет такой информацией, просьба поделиться Wink

2 - реализация IEndpointBehavior на стороне сервера

ри возникновении ошибки на стороне сервера инфраструктура WCF упаковывает сообщение об ошибке в SOAP сообщение специального формата и отправляет это сообщение клиенту с кодом 500. Идея метода заключается в том, чтобы заменить код 500 на 200 (детали см. здесь). Недостаток этого метода заключается в том, что необходимо вносить изменения на сервере. Благо - изменения можно свести к модификации файла конфигурации.

Сравнение двух методов и выводы

Сравнение основных характеристик:
ХарактеристикаClientHttpIEndpointBehavior
Нужно менять клиентский код Да, нужно зарегистрировать префиксНет
Нужно менять серверный кодНетДа, по крайней мере, app.config
Совместимость с проксиЕсли не нужно задавать логин/парольПолная

После нескольких месяцев эксплуатации системы teamtools с использованием ClientHttp было решено перейти на BrowserHttp и сконфигурировать WCF-сервисы для использования их из SilverLight.