通过 WCF Rest 服务提供 clientaccesspolicy.xml,同时托管在 IIS 上
我正在构建一个简单的 HTTP 文件服务器。
我有一个公开 WCF 服务 (FileService.svc) 的 asp.net Web 应用程序。
服务契约是:
[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 文件 问题是,现在该请求将无法到达服务,因为 FileService.svc 已从 url 中省略。
(我希望所有文件请求都由 HandleFileRequest() 中的 WCF 服务处理,而不是任何其他机制。)
我能想到的一种解决方案是使用 IIS 7 的 URL Rewrite 模块。
这是执行此操作的正确方法,还是有更简单的解决方案?
I am building a simple HTTP file server.
I have an asp.net web application that exposes a WCF service (FileService.svc).
The service contract is:
[OperationContract]
[WebGet(UriTemplate = "/*")]
Stream HandleFileRequest();
The service implementation is quite straightforward and basically I use :
WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri
To get the path of the file to return (A little parsing is required to extract it).
So for instance, when hosting the app locally on IIS , I can request a file from :
http://localhost:65000/FileService.svc/someFolder1/someFolder2/someFile1.jpg
The problems starts when this request is made from inside a silverlight app. Silverlight searches the clientaccesspolicy file in http://localhost:65000/clientaccesspolicy.xml
The problem is that now, this request won't reach the service because FileService.svc is ommited from the url.
(I want all the file requests to be handled by the WCF service in HandleFileRequest(), and not any other mechanism.)
One solution I can think of is to use the URL Rewrite module of IIS 7.
Is this the right way to do this, or there simpler solution to this ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Silverlight 使用的 clientaccesspolicy.xml 必须位于域根目录上 - 在您的示例中,这意味着 http://localhost:65000/clientaccesspolicy.xml。策略文件对于每个域都是唯一的,而不是每个服务。不过,您可以通过在 clientaccesspolicy.xml 文件中为每项服务添加一个元素来为不同的服务设置不同的策略,如下例所示。
The clientaccesspolicy.xml used by Silverlight has to be on the domain root - in your example that would mean http://localhost:65000/clientaccesspolicy.xml. The policy file is unique per domain, not per service. You can, however, set different policies for different services by adding one element for each service in the clientaccesspolicy.xml file, as shown in the example below.