当使用跨域WCF服务时,OPTIONS方法被拒绝

本文关键字:OPTIONS 方法 拒绝 服务 WCF | 更新日期: 2023-09-27 18:18:18

我正在尝试对WCF服务执行POST。当使用Firefox 8时,浏览器首先发送一个OPTIONS HTTP请求。

当我使用WebMessageBodyStyle时,这工作得很好。就像BodyStyle一样,但是我想使用的是Wrapped body样式。当我切换到Wrapped时,OPTIONS请求被拒绝,状态为400。我怀疑这是因为OPTIONS请求没有正文,因此BodyStyle解析器失败。

这是我的web方法的布局:

[OperationContract(ProtectionLevel = ProtectionLevel.None)]
[WebInvoke(Method = "*",
           BodyStyle = WebMessageBodyStyle.Wrapped,
           RequestFormat = WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json)]
bool Ping(String msg);

和我使用以下jquery调用:

$.ajax({
            url: "http://localhost/Server/Service.svc/Ping",
            data: JSON.stringify({msg: msg}),
            type: "POST",
            processData: false,
            contentType: "application/json",
            timeout: 10000,
            dataType: "text"
});
在这个问题上我将非常感谢任何帮助。谢谢! !

当使用跨域WCF服务时,OPTIONS方法被拒绝

我通过向端点行为添加一个自定义IErrorHandler来解决这个问题。关于如何这样做的一般说明在这里。

public bool HandleError(Exception error)
{
  if (error.Message.Contains("IsEmpty = true")) return true;
  return false;
}

public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            if (error.Message.Contains("IsEmpty = true"))
            {
                fault = Message.CreateMessage(version, "");
                var jsonFormatting = new WebBodyFormatMessageProperty(WebContentFormat.Json);
                fault.Properties.Add(WebBodyFormatMessageProperty.Name, jsonFormatting);
                var httpResponse = new HttpResponseMessageProperty
                                       {
                    StatusCode = System.Net.HttpStatusCode.OK,
                    StatusDescription = "OK"
                };
                fault.Properties.Add(HttpResponseMessageProperty.Name, httpResponse);
            }
            else
            {
                fault = GetJsonFaultMessage(version, error);
                var jsonFormatting = new WebBodyFormatMessageProperty(WebContentFormat.Json);
                fault.Properties.Add(WebBodyFormatMessageProperty.Name, jsonFormatting);
                var httpResponse = new HttpResponseMessageProperty
                                       {
                    StatusCode = System.Net.HttpStatusCode.BadRequest,
                    StatusDescription = "Bad Request"
                };
                fault.Properties.Add(HttpResponseMessageProperty.Name, httpResponse);
            }
        }