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

Dor*_*hen 2 c# wcf google-chrome cross-domain cors

我按照Ido Flatow的帖子创建了一个跨源请求并创建了以下内容:

在我的服务界面上:

[OperationContract]
[WebInvoke(Method = "*", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
bool GetUserAuthentication(string userLoginName, string password);
Run Code Online (Sandbox Code Playgroud)

在app.config上:

<behaviors>
  <endpointBehaviors>
    <behavior name="webSupport">
      <webHttp />
      <CorsSupport />
    </behavior>
  </endpointBehaviors>
</behaviors>

<extensions>
  <behaviorExtensions>
    <add name="CorsSupport" type="WebHttpCors.CorsSupportBehaviorElement, WebHttpCors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </behaviorExtensions>
</extensions>
Run Code Online (Sandbox Code Playgroud)

现在我发送一个简单的帖子请求使用angular $ http服务,它正在使用IE&Edge(也在Postman上),但无法在Chrome和Firefox上运行,但出现以下错误:

XMLHttpRequest无法加载 http:// localhost:5280/MetaDataService/GetUserAuthentication.预检的响应具有无效的HTTP状态代码400

Chrome错误打印屏幕:

错误

Dor*_*hen 7

Chrome正在预检查找CORS标头的请求.如果请求是可接受的,它将发送实际请求.

我的问题是发送到我的WCF服务器的OPTIONS请求被拒绝我Method="*"为我的方法定义,导致选项请求被定向到我的方法,并期望获得参数.

基于如何使用WCF自托管问题处理Ajax JQUERY POST请求的解决方案是添加新的OperationContract来处理OPTIONS请求:

[OperationContract]
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
void GetOptions();

public void GetOptions()
{
}
Run Code Online (Sandbox Code Playgroud)

此方法获取所有选项请求,并允许将真正的POST方法定向到我的服务方法.