我正在尝试对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"
});
感谢您对此问题的任何帮助...... 谢谢!
答案 0 :(得分:2)
我通过向端点行为添加自定义ErrorHandler来解决这个问题。 有关如何执行此操作的一般说明是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);
}
}