使用 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
问题已解决!!
该代码对 GET 和 POST 都非常有效,但是 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);
我正在使用一些 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
问题已解决!!
该代码对 GET 和 POST 都非常有效,但是 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);