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

Posted

技术标签:

【中文标题】使用跨域 WCF 服务时,OPTIONS 方法被拒绝【英文标题】:OPTIONS method refused when consuming cross-domain WCF service 【发布时间】:2012-01-24 08:13:17 【问题描述】:

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

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

这是我的网络方法的布局:

[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"
);

我将不胜感激有关此问题的任何帮助... 谢谢!!

【问题讨论】:

【参考方案1】:

我通过向 Enpoint Behavior 添加自定义 IErrorHandler 解决了这个问题。 有关如何执行此操作的一般说明是here。

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);
            
        

【讨论】:

以上是关于使用跨域 WCF 服务时,OPTIONS 方法被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 jQuery 方法 getJSON 跨域将复杂对象传递给 WCF 服务?

OPTIONS 方法在跨域请求(CORS)中的应用

http options请求

WCF REST 服务模板 40(CS) 跨域错误

跨域调用 WCF 服务

WCF Silverlight 跨域问题