Недавно один разработчик обратился ко мне и Мише с вопросом.
Суть вопроса такова.
Есть silverlight клиент, есть WCF сервис. Сервис доступен, скажем, по адресу http://localhost:8731/classic с wsHttpBinding или даже basicHttpBinding.
Сервис self hosted -ну то есть без всякого IIS в консольном приложении или сервисе есть код, который запускает сервис. Как то так.
Ну и есть собственно сервис, в моем примере это IService2 и класс Service1.
Конфиг выглядит примерно так
Задача – сделать так чтобы по адресу http://localhost:8731/clientacccesspolicy.xml выдавался нужный нам файл.
Решение
Воспользуемся возможностями .NET 3.5 по работе с REST.
1) Добавим контракт, который будет реализовывать выдачу файла.
Обратим внимание на параметр URITemplate – этот параметр описывает, как должен выглядеть WEB запрос.
2) Добавим настройки в конфиг файл. Нам ну��но по адресу http://localhost:8731 добавить endpoint с webBinding, а также прописать endpointBehavior. Можно сделать из утилиты WCF Service Configuraiton Editor, можно руками.
Итак, что пришлось добавить.
Итоговый конфиг
То есть мы сказали WCF, что запросы по адресу http://localhost:8731 обрабатывает webHttpBinding, а по адресу http://localhost:8731/classic – классический binding. (я взял wsHttpBinging, вроде говорят что для silverlight нужен другой).
3) Осталось написать реализацию. Я положи нужный мне XML в ресурсы, чтобы код не загромождать.
Обратим внимание на следующие моменты.
С помощью специального класса WebOperationContext, содержащего настройки специфичные для web запроса и ответа, я настроил правильный тип содержимого.
Второе – я зачем то занимаюсь шаманством с закрытием и открытием потока. Объясняю.
Метод требует возврата ОТКРЫТОГО потока – поток закрывается сам дальше. Но у меня же есть еще и StreamWriter, который я честно пытаюсь закрыть! А он берет и закрывает нижележащий поток (MemoryStream). Подумал я , да и решил закрыть StreamWriter, MemoryStream , а потом открыть заново.
ВСЁ! Не так страшно и сложно.
Итог – у меня есть сервис, который замечательно выдает clientaccesspolicy.xml, а также работает как обычный сервис.
пример кода приложен.
Ссылки
ms-help://MS.MSDNQTR.v90.en/wcf_con/html/0283955a-b4ae-458d-ad9e-6fbb6f529e3d.htm
http://msdn.microsoft.com/en-us/library/cc681221(VS.100).aspx