使用 CORS 在不同的域上访问 API

Accessing API on different domain with CORS

我正在使用一些 GET 和 POST 方法开发 self-hosted WCF 服务,

例如

[OperationContract]
[WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Wrapped)]
public string HelloWorld(){
    ....
}

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped)]
public string GetMessage(string username){
    ....
}

在客户端访问托管在不同域上的那些服务时,出现以下错误

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:57805' is therefore not allowed access. The response had HTTP status code 400.

在网上查了下,发现可以通过在每个WCF函数中加入如下代码来解决这个错误

  WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");
    if (WebOperationContext.Current.IncomingRequest.Method == "OPTIONS")
    {
        WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
        WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Header", "Content-Type, Accept, SOAPAction");
        WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Credentials", "false");
        }

现在这段代码非常适用于 GET 方法,因此我可以看到响应 header 中添加了 "Access-Control-Allow-Origin"。但是,它不适用于 POST 方法,因为响应 header 根本没有变化。

有谁知道为什么它不适用于 POST 方法? 我已将 GetMessage 更改为 GET 方法,响应 header 立即起作用,但当我将其更改回 POST

问题已解决!!

该代码对 GETPOST 都非常有效,但是 Web 服务为我的 POST函数,因此导致失败。

The OperationFormatter could not deserialize any information from the Message because the Message is empty (IsEmpty = true).

通过将函数的 BodyStyle 更改为 WrappedResponse,错误消失并且可以在域外访问该函数

 [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedResponse)]
    Booking CreateNewBooking(int divisionId);