#silverlight #iis #wcf-rest #clientaccesspolicy.xml
#silverlight #iis #wcf-rest #clientaccesspolicy.xml
Вопрос:
Я создаю простой HTTP-файловый сервер.
У меня есть asp.net веб-приложение, предоставляющее службу WCF (FileService.svc).
Контракт на обслуживание заключается:
[OperationContract]
[WebGet(UriTemplate = "/*")]
Stream HandleFileRequest();
Реализация сервиса довольно проста, и в основном я использую :
WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri
Чтобы вернуть путь к файлу (для его извлечения требуется небольшой синтаксический анализ).
Так, например, при локальном размещении приложения в IIS я могу запросить файл у : http://localhost:65000/FileService.svc/someFolder1/someFolder2/someFile1.jpg
Проблемы начинаются, когда этот запрос выполняется из приложения silverlight. Silverlight выполняет поиск в файле clientaccesspolicy в http://localhost:65000/clientaccesspolicy.xml
Проблема в том, что теперь этот запрос не дойдет до службы, потому что FileService.svc отсутствует в URL.
(Я хочу, чтобы все запросы к файлам обрабатывались службой WCF в HandleFileRequest(), а не каким-либо другим механизмом.)
Одно из решений, которое я могу придумать, — использовать модуль перезаписи URL-адреса IIS 7.
Это правильный способ сделать это, или есть более простое решение для этого?
Ответ №1:
The clientaccesspolicy.xml используемый Silverlight должен быть в корневом каталоге домена — в вашем примере это означало бы http://localhost:65000/clientaccesspolicy.xml . Файл политики уникален для каждого домена, а не для каждой службы. Однако вы можете установить разные политики для разных служб, добавив по одному элементу для каждой службы в clientaccesspolicy.xml файл, как показано в примере ниже.
<?xml version="1.0" encoding="utf-8"?> <политика доступа> <междоменный доступ> <политика> <разрешить-из http-request-headers="*"> <uri домена="*"/> </разрешить-от> <предоставление> <путь к ресурсу="/FileService.svc/" включает подпути="true"/> <предоставить-кому> </политика> <политика> <разрешить-из http-request-headers="*"> <uri домена="http://some.other.domain "/> </разрешить-от> <предоставление> <путь к ресурсу="/AnotherService/", включая подпути="true"/> <предоставить-кому> </политика> <междоменный доступ> </политика доступа>