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 数据服务:

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 与数据服务一起工作,我是否缺少一些东西?

4

1 回答 1

3

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

与您的直接问题无关的一些注意事项:由于未正确支持CORS ,因此您找到的软件包或任何其他解决方案都不会真正令人满意(您将无法轻松指定您的策略)。可以使用 WCF 检查器创建一个专业维护的包来执行此操作,但我还没有看到任何。相反,如果您同意,我想邀请您对此进行投票。

同时,我只能建议您非常仔细地集成您在网络上找到的任何代码(因为大多数代码几乎没有经过测试)。这篇文章可能会帮助你。这与数据服务没有直接关系,但它是相同的 WCF 技术。也许看看 Web API 实现或其他项目以获得灵感。

祝你好运。

PS:在 90% 的情况下,您还想忘记涉及代理的解决方案。在大多数架构中,除非您的边缘后端的设计方式使其看起来不那么笨拙,否则它非常可怕并且毫无意义。

更新:还要验证您使用的实现是否OPTIONS正确处理请求。如果它通过它们,WCF 数据服务将返回 501,并且即使标头设置正确,拦截器也可能只是将它通过。由于预检请求不需要正文,因此快速而肮脏的 hack 将获取这些 501 并将它们更改为 200,但显然您确实希望首先阻止请求访问数据服务。

于 2013-11-07T17:48:09.530 回答