我正在开发一个带有一些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
答案 0 :(得分:0)
问题解决了!!
该代码适用于 GET 和 POST ,但是对于 POST 函数,Web服务会抛出以下错误,因此会导致失败。
OperationFormatter无法反序列化来自的任何信息 消息,因为消息为空(IsEmpty = true)。
通过将函数的BodyStyle更改为WrappedResponse,错误消失并且可以在域外访问该函数
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedResponse)]
Booking CreateNewBooking(int divisionId);