WCF DataService(OData)和CORS

时间:2013-11-06 09:19:58

标签: c# wcf odata cors dataservice

我正在尝试让WCF DataService处理跨域请求。 我发现这是如何让WCF服务与CORS一起使用的: http://blogs.microsoft.co.il/blogs/idof/archive/2011/07/02/cross-origin-resource-sharing-cors-and-wcf.aspx

我下载了示例,但无法使用DataService。它适用于示例服务,但不适用于我的DataService。

这是我非常简单的WCF DataService:

public class TestService : DataService<DataContext>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.UseVerboseErrors = true;
        config.SetEntitySetAccessRule("Items", EntitySetRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
    }
} 

TestService.svc文件:

<%@ ServiceHost Language="C#" Factory="WebHttpCors.CorsWebServiceHostFactory, WebHttpCors" Service="MvcApplication1.TestService" %>

DataContext也很简单:

public class DataContext : DbContext
{
    public DbSet<Item> Items { get; set; }
}

但是,预检选项请求仍返回501。 我是否缺少让CORS与Dataservice一起工作的东西?

1 个答案:

答案 0 :(得分:3)

如果您使用的是IIS,请验证ExtensionLess处理程序是否已配置为处理OPTIONS请求。

与您的直接问题无关的一些注意事项:由于CORS为not properly supported,因此您找到的包裹和any other solutions都不会真正令人满意(您将无法轻松指定您的政策)。可以使用WCF检查员创建一个专业维护的包,但我还没有看到。相反,如果您同意,我想邀请您vote this up

与此同时,我只能建议您仔细整合您在网络上找到的任何代码(因为大部分代码都经过测试)。 This article可能会帮助您。这与数据服务没有直接关系,但它与WCF技术相同。也许可以查看Web API实现或other projects获取灵感。

祝你好运。

PS:在90%的情况下,您还想忘记涉及proxying的解决方案。在大多数体系结构中,它只是非常糟糕,除非你的边缘后端设计成某种方式使其看起来不那么笨拙。

更新:还要验证您使用的实施是否实际正确处理了OPTIONS个请求。如果它通过它们,WCF数据服务将返回501,即使标题设置正确,拦截器也可能只是将其传回。由于预检请求不需要正文,快速而肮脏的黑客就是拾取这些501并将其更改为200秒,但显然你真的想要阻止请求首先点击数据服务。