使用CORS访问不同域上的API

时间:2015-04-09 00:28:10

标签: wcf api post http-headers cors

我正在开发一个带有一些GET和POST方法的自托管WCF服务,

例如

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

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

当访问托管在不同域上的客户端上的那些服务时,我遇到以下错误

  

请求时没有'Access-Control-Allow-Origin'标头   资源。因此不允许来源“http://localhost:57805”   访问。响应的HTTP状态代码为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 方法,因此我可以看到响应头中添加了“Access-Control-Allow-Origin”。但是它不适用于 POST 方法,因为响应标头根本没有变化。

有没有人知道为什么它不能用于 POST 方法? 我已将GetMessage更改为 GET 方法,响应标头立即生效但未将其更改回 POST

1 个答案:

答案 0 :(得分:0)

问题解决了!!

该代码适用于 GET POST ,但是对于 POST 函数,Web服务会抛出以下错误,因此会导致失败。

  

OperationFormatter无法反序列化来自的任何信息   消息,因为消息为空(IsEmpty = true)。

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

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