WCF无法反序列化JSON请求

时间:2012-04-29 01:49:40

标签: json wcf

我正在尝试编写一个WCF服务来响应ajax请求,但是在尝试反序列化时我遇到了一个奇怪的错误。

这是jQuery:

$.ajax({
    type: 'POST', 
    url: 'http://localhost:4385/Service.svc/MyMethod',
    dataType: 'json',
    contentType: 'application/json',
    data: JSON.stringify({folder:"test", name:"test"})
});

以下是WCF服务定义:

[OperationContract]
[WebInvoke(UriTemplate = "/MyMethod", 
    Method = "*", //Need to accept POST and OPTIONS
    BodyStyle = WebMessageBodyStyle.WrappedRequest, 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json)]
string[] MyMethod(string folder, string name);

我得到一个SerializationException说:“OperationFormatter无法反序列化Message中的任何信息,因为Message为空(IsEmpty = true)。”

它出现在指令System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest

的方法00000108 mov dword ptr [ebp-18h],0

我看不出我做错了什么,但它拒绝为我工作。一整天都在打架。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

知道了 - 答案是在我的代码中唯一的评论中盯着我看。我需要接受POST和OPTIONS(对于CORS)。 OPTIONS请求首先出现,当然OPTIONS请求没有附加数据。 是造成解析异常的原因;从来没有发生过POST。

解决方法:将POST和OPTIONS分成两个独立的方法,使用相同的UriTemplate,但使用不同的C#名称(WCF需要这个)。

[OperationContract]
[WebInvoke(UriTemplate = "/MyMethod",
    Method = "POST",
    BodyStyle = WebMessageBodyStyle.WrappedRequest,
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json)]
string[] MyMethod(string folder, string name);

[OperationContract]
[WebInvoke(UriTemplate = "/MyMethod", Method = "OPTIONS")]
void MyMethodAllowCors();

这实际上清理了一些代码,因为您不必使用

乱丢所有功能
if (WebOperationContext.Current.IncomingRequest.Method == "OPTIONS") {
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "OPTIONS, POST");
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Headers", "Content-Type, User-Agent");
    return new string[0];
} else if (WebOperationContext.Current.IncomingRequest.Method == "POST") { ... }