Обслуживание clientaccesspolicy.xml через службу WCF Rest при размещении в IIS

#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"/>
 <предоставить-кому>
 </политика>
 <междоменный доступ>
</политика доступа>