WCF DataService 不支持预检选项请求?

Posted

技术标签:

【中文标题】WCF DataService 不支持预检选项请求?【英文标题】:WCF DataService not supporting preflight OPTIONS requests? 【发布时间】:2012-11-11 01:59:15 【问题描述】:

我想使用基于 ajax 的组件 (KendoUI) 来读取/修改由 WCF DataServices 实现的 OData 端点上的实体。

首先,服务实现相当简单:

public class MyFooService : DataService<FooContext>

    public static void SetEntitySetAccessRules(IDataServiceConfiguration config)
    
        config.SetEntitySetAccessRule("Foos", EntitySetRights.AllWrite);
    

现在我期待能够使用 PUT 修改实体。 KendoUI 提供了一个漂亮且简单的配置界面,并且在生成 PUT 请求方面做得很好。

我们正在发出跨域请求并使用 CORS。因此,例如,Firefox 会在发送 PUT 之前向 OData 服务发送预检 OPTIONS 请求。

不幸的是,服务端点似乎不支持开箱即用的 OPTIONS:对 OPTIONS 请求的响应是“501 Not Implemented”,内容为空。至少我们设法使响应具有如下 CORS 标头:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
  <!-- Enable cross-origin resource sharing -->
  <!-- http://enable-cors.org/#how-asp.net -->
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Methods" value="POST, PUT, DELETE, GET, OPTIONS" />
      <add name="Access-Control-Allow-Headers" value="content-Type, accept, origin, X-Requested-With" />
      <add name="Access-Control-Allow-Credentials" value="true" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

在谷歌上搜索这个有点挑战性,因为“选项”是一个非常流行的术语......

我找到了this article,但它看起来非常、非常复杂。我的意思是,OData 都是关于 REST 的,我无法想象 WCF 数据服务不提供一种简单的方法来允许预检请求,或者?

【问题讨论】:

我认为 WCF OData 服务在 WCF 上工作并通过相同的 WCF 管道。如果是这样,请查看此answer. 中的链接。恕我直言,这是在 WCF 中实现 CORS 的最简单方法。 我知道这不是您想要的,但我认为处理跨域请求的最简单方法就是使用 IIS 的反向代理。这样,您只针对您自己的域,而 IIS 将您的请求发送到其他域。然后,您的代码不必了解其他域的任何信息。 偶然发现了这个;只是想我会链接到this 和that 以进行更多讨论。 【参考方案1】:

目前 WCF DataServices 不支持 CORS,而且我看到的每个解决方案都是 hack,充其量只能工作。

我遇到了同样的问题,我只是将我的代码从 WCF 移植到 Web API 2 OData 解决方案。 Web API 2 支持 CORS,而且非常容易设置。

如果您熟悉 Web API,请查看此链接: http://msdn.microsoft.com/en-us/magazine/dn532203.aspx

这里有一个关于如何使用 Web API 创建 OData 端点的教程: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/creating-an-odata-endpoint

【讨论】:

谢谢。虽然答案很晚(我也通过切换到 WebAPI 解决了这个问题 :-))——据我所知,这对任何未来的读者来说都是一个有用的答案。

以上是关于WCF DataService 不支持预检选项请求?的主要内容,如果未能解决你的问题,请参考以下文章

从 JavaScript 访问 WCF WebService - 对预检请求的响应未通过访问控制检查

如何处理预检请求?

预检响应中不允许使用方法选项

预检的 Wcf webHttpBinding 响应具有无效的 HTTP 状态代码 400

跨域请求被阻止原因:CORS 预检通道未成功

由于主键约束,无法向 WCF DataService 提交新对象