WCF DataService是否支持预检OPTIONS请求?

6
我希望使用基于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>

由于“选项”是一个非常流行的术语,因此在Google上搜索这个词有点具有挑战性...

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


1
我认为WCF OData服务是基于WCF工作的,并通过相同的WCF管道传递。如果是这样,请查看此[答案]中的链接(https://dev59.com/T2bWa4cB1Zd3GeqPWGTp#11606701)。 依我之见,这是在WCF中实现CORS的最简单方法。 - Obaid
我知道这不完全是你想要的,但我认为处理跨域请求最简单的方法就是使用IIS的反向代理。这样,你只需要与自己的域名打交道,而IIS会将你的请求发送到其他域名。这样,你的代码就不需要了解其他域名的任何信息。 - lontivero
偶然发现这个问题;只是想链接到这个那个以供进一步讨论。 - tne
1个回答

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解决了问题:-)),但我认为这个答案对于未来的读者来说会非常有帮助。 - chiccodoro

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