序列化/反序列化实体时可以改写默认的WCF DataContractSerializer行为,而改用JSON.NET吗?
我具有以下处理城市实体的服务合同。出于设计原因,City实体的IsReference = true,因此默认的DataContractSerializer引发错误。
对于“ GET”方法,我可以使用JsonConvert.DeserializeObject处理这种情况,但对于“ PUT,POST,DELETE”方法,DataContractSerializer优先且无法抱怨IsReference实体无法序列化。
我已经找到了实现IOperationBehavior并提供我自己的序列化程序的帖子,但是我不知道如何将Json.NET与此集成。我认为应该有更直接的方法。
对于这种情况的任何帮助或指导,或对其他方法的建议,我将不胜感激。
[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)非常有趣,但是对于您的特殊问题,它更容易解决方法。
DataContractSerializerOperationBehavior
如果您已经使用Messagetype返回使用WCF4返回的结果,则可以执行以下操作:
Message
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.Unauthorized或HttpStatusCode.Conflict)或在其他情况下需要设置HTTP状态代码(如HttpStatusCode.Created),则可以继续使用WebOperationContext.Current.OutgoingResponse.StatusCode。
HttpStatusCode.Unauthorized
HttpStatusCode.Conflict
HttpStatusCode.Created
WebOperationContext.Current.OutgoingResponse.StatusCode
另外,您也可以返回a 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。如果要使用此技术来生成响应,请不要忘记在写入流后将流位置设置为0。
Stream
CreateStreamResponse
CreateTextResponse