如何将Json.Net设置为WCF REST服务的默认序列化程序

是否有可能覆盖默认的WCF DataContractSerializer行为时Serialize / DeSerialize实体和使用JSON.NET?

我有以下服务合同来处理城市实体。 由于devise原因,City实体具有IsReference = true,因此默认的DataContractSerializer引发错误。

对于“GET”方法,我可以用JsonConvert.DeserializeObject来处理这种情况,但是使用“PUT,POST,DELETE”方法时,DataContractSerializer优先,并且无法抱怨IsReference实体无法序列化。

我发现这篇文章实现IOperationBehavior并提供我自己的串行器,但我不知道如何将Json.NET与此集成。 我相信对此应该有更直接的方法。

我很感激任何有关这种情况的帮助或指导,或build议其他方法。

[ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed) [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class CityService { [Description("Get all Cities")] [WebGet(UriTemplate = "")] public Message Cities() { } [Description("Allows the details of a single City to be updated.")] [WebInvoke(UriTemplate = "{code}", Method = "PUT")] public Message UpdateCity(string code, City city) { } } 

非常感谢

霍山

扩展编码器和序列化器(请参阅http://msdn.microsoft.com/en-us/library/ms733092.aspx )或扩展WCF(如DataContractSerializerOperationBehavior使用)的其他方法的使用非常有趣,但对于您的特殊问题,更简单的解决方法

如果你已经使用Messagetypes来返回结果使用WCF4你可以做如下的事情:

 public Message UpdateCity(string code, City city) { MyResponseDataClass message = CreateMyResponse(); // use JSON.NET to serialize the response data string myResponseBody = JsonConvert.Serialize(message); return WebOperationContext.Current.CreateTextResponse (myResponseBody, "application/json; charset=utf-8", Encoding.UTF8); } 

如果发生错误(如HttpStatusCode.UnauthorizedHttpStatusCode.Conflict ),或者在需要设置HTTP状态代码(如HttpStatusCode.Created )的其他情况下,可以继续使用WebOperationContext.Current.OutgoingResponse.StatusCode

作为替代scheme,您也可以返回一个Stream (请参阅http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx和http::// msdn .microsoft.com / en-us / library / ms732038.aspx )而不是Message来返回没有Microsoft JSON序列化程序的其他默认处理任何数据。 在WCF4的情况下,您可以使用CreateStreamResponse (请参阅http://msdn.microsoft.com/zh-cn/library/dd782273.aspx )而不是CreateTextResponse 。 如果你使用这种技术来产生响应,不要忘记在stream中写入stream后将stream的位置设置为0。

为什么要特别使用Json.NET库有一些原因吗? 如果你想返回JSON,为什么不使用WebGet和WebInvoke属性中的ResponseFormat属性呢?

 [WebGet(UriTemplate = "", ResponseFormat = WebMessageFormat.Json)] 

这应该在大多数情况下。 你正在运行什么版本的WCF? 任何你要返回消息types而不是实际types的原因?