在IIS上托管时,通过WCF Rest服务提供clientaccesspolicy.xml

时间:2011-04-26 10:54:59

标签: silverlight iis wcf-rest clientaccesspolicy.xml

我正在构建一个简单的HTTP文件服务器 我有一个asp.net Web应用程序,它公开了一个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在http://localhost:65000/clientaccesspolicy.xml中搜索clientaccesspolicy文件 问题是,现在,此请求将无法访问服务,因为从URL中省略了FileService.svc。

(我希望所有文件请求都由HandleFileRequest()中的WCF服务处理,而不是任何其他机制。)

我能想到的一个解决方案是使用IIS 7的 URL重写模块。
这是正确的方法,还是有更简单的解决方案?

1 个答案:

答案 0 :(得分:0)

Silverlight 使用的clientaccesspolicy.xml必须是域根目录 - 在您的示例中,这意味着http://localhost:65000/clientaccesspolicy.xml。策略文件对于每个域是唯一的,而不是每个服务。但是,您可以通过在clientaccesspolicy.xml文件中为每个服务添加一个元素来为不同的服务设置不同的策略,如下例所示。

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource path="/FileService.svc/" include-subpaths="true"/>
      </grant-to>
    </policy>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="http://some.other.domain"/>
      </allow-from>
      <grant-to>
        <resource path="/AnotherService/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>