WCF 数据服务 (OData) 和 CORS

Posted

技术标签:

【中文标题】WCF 数据服务 (OData) 和 CORS【英文标题】:WCF DataService (OData) and CORS 【发布时间】:2013-11-17 10:52:40 【问题描述】:

我正在尝试让 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 数据服务:

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】:

如果您使用的是 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,并且即使标头设置正确,拦截器也可能只是将其通过。由于 preflight 请求不需要正文,因此快速而肮脏的 hack 将获取这些 501 并将它们更改为 200,但显然您确实希望首先阻止请求访问数据服务。

【讨论】:

非常感谢,这对我很有帮助,尤其是更新的部分,这是501的来源,我确实可以将它设置为200。我同意你的看法,这既快又脏,我会检查我们是否可以转移到 Web API 以进行正确的实现。 我的 odata 服务也遇到了同样的问题,找不到解决这个问题的方法@Malyngo,你有解决方案吗?? Royaan,我所做的是使用此代码:skydrive.live.com/…,然后在 BeforeSendReply 方法中将 CorsMessageInspector 中的 ResponseCode 更改为 200。但正如 tne 所说,这是一个快速而肮脏的 hack。 同时,我已将 DataService 移植到 WebAPI。我只能向需要 COR 支持其 ODATA 服务的任何人推荐它。易于实施,效果很好:msdn.microsoft.com/en-us/magazine/dn532203.aspx

以上是关于WCF 数据服务 (OData) 和 CORS的主要内容,如果未能解决你的问题,请参考以下文章

将 WCF 服务中的数据公开为 oData

Odata 压缩 - 有任何支持吗? (用于 WinRT 的 WCF 数据服务 5.0)

您可以将 WCF 数据服务(ne OData、ne Astoria、ne ADO.NET 数据服务)与 NetTcpBinding 一起使用吗?

带有 WCF REST 的 OData

与 OData 控制器等效的 Odata WCF 服务功能

是否有用于 OData 协议 Uri 的 .NET 类包装器