WCF 无法反序列化 JSON 请求

Posted

技术标签:

【中文标题】WCF 无法反序列化 JSON 请求【英文标题】:WCF fails to deserialize JSON request 【发布时间】:2012-04-29 01:49:39 【问题描述】:

我正在尝试编写一个 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 无法反序列化消息中的任何信息,因为消息为空 (IsEmpty = true)。”

它发生在指令00000108 mov dword ptr [ebp-18h],0上的方法System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest

我看不出我做错了什么,但它拒绝为我工作。整天都在和这个争吵。有什么想法吗?

【问题讨论】:

【参考方案1】:

知道了——答案就在我代码中唯一的 cmets 中。我需要同时接受 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")  ... 

【讨论】:

以上是关于WCF 无法反序列化 JSON 请求的主要内容,如果未能解决你的问题,请参考以下文章

C# Restful WCF 服务。无法在帖子正文中反序列化 XML

错误:预期状态。无法反序列化 JSON 对象

得到“JSON 请求太大而无法反序列化”

JSON 请求太大,无法反序列化。

WCF DataContractJsonSerializer 如何反序列化 json DateTime?

在WCF中怎么实现接口反序列化和序列化为JSON