WCF DataService(OData)和CORS

4
我正在尝试使用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与数据服务配合工作?

1个回答

3
如果您正在使用IIS,请验证ExtensionLess处理程序已配置为处理OPTIONS请求。
与您直接问题无关的一些注意事项:由于CORS未得到适当支持,因此您找到的软件包或者其他解决方案都不会真正令人满意(您将无法轻松指定自己的策略)。使用WCF检查器可以创建专业维护的软件包来执行此操作,但我没有看到过这样的软件包。相反,如果您同意,我想邀请您赞同此提议
与此同时,我只能建议您非常小心地集成您在网上找到的任何代码(因为大多数代码都没有经过充分测试)。 这篇文章 可以帮助您。虽然这与数据服务不直接相关,但它是相同的 WCF 技术。也许可以看看 Web API 实现或 其他项目 以获得灵感。
祝好运。
附注:在90%的情况下,您还需要忘记涉及代理的解决方案。在大多数架构中,这只会使事情变得更糟,并且除非您的边缘后端的设计方式使其看起来不那么混乱,否则几乎没有意义。

更新:还要验证您使用的实现是否正确处理OPTIONS请求。如果它们被传递,WCF数据服务将返回501,并且拦截器可能会将其正确设置头文件的情况下传递回来。由于预检请求不需要主体,因此一个快速而肮脏的解决方法是捡起这些501并将它们更改为200,但显然您真正想要做的是阻止请求首先到达数据服务。


非常感谢,这确实帮了我很多,特别是更新的部分,这就是501来自的地方,我确实可以将其设置为200。我同意您的看法,这是一种快速而简单的方法,我会检查是否可以转移到Web API以进行适当的实现。 - Malyngo
我遇到了与我的OData服务相同的问题,无法找到解决这个麻烦的方法。@Malyngo,您有没有关于此的解决方案? - Numan Hanif
Royaan,我的做法是使用这段代码:https://skydrive.live.com/?cid=b44e3f2dbfe68834&id=B44E3F2DBFE68834%21210&authkey=!AJX5ih16x5rAuwE 然后在CorsMessageInspector的BeforeSendReply方法中将ResponseCode更改为200。但正如tne所说,这只是一个快速而肮脏的hack。 - Malyngo
与此同时,我已经将DataService移植到了WebAPI上。我强烈推荐任何需要ODATA服务的CORS支持的人使用它。易于实现,运行效果非常好:http://msdn.microsoft.com/en-us/magazine/dn532203.aspx - Malyngo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接