WCF DataService不支持预检OPTIONS请求?

时间:2012-11-22 16:17:50

标签: wcf-data-services odata cors preflight

我想使用基于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数据服务不提供允许预检请求的简单方法,还是?

1 个答案:

答案 0 :(得分:1)

目前,WCF DataServices不支持CORS,我所看到的每个解决方案都是黑客攻击,并且最多只能使用。

我遇到了同样的问题,我只是将我的代码从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