Hos*_*sam 22 rest wcf json .net-4.0 json.net
在Serialize/DeSerialize实体并使用JSON.NET时,是否可以覆盖默认的WCF DataContractSerializer行为?
我有以下服务合同来处理City实体.出于设计原因,City实体具有IsReference = true,因此默认的DataContractSerializer会引发错误.
对于"GET"方法,我可以使用JsonConvert.DeserializeObject处理这种情况,但是使用"PUT,POST,DELETE"方法DataContractSerializer优先,并且失败抱怨IsReference实体无法序列化.
我发现这个Post实现IOperationBehavior并提供我自己的Serializer但我不知道如何将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)
{
}
}
Run Code Online (Sandbox Code Playgroud)
非常感谢
霍山
Ole*_*leg 21
使用扩展编码器和序列化器(参见http://msdn.microsoft.com/en-us/library/ms733092.aspx)或其他扩展WCF的方法就像使用一样DataContractSerializerOperationBehavior非常有趣,但对于您的特殊问题则更容易解决方法.
如果您已经使用Messagetype来返回结果,那么使用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);
}
Run Code Online (Sandbox Code Playgroud)
如果出现错误(如HttpStatusCode.Unauthorized或HttpStatusCode.Conflict),或者在需要设置HTTP状态代码(如HttpStatusCode.Created)的其他情况下,您可以继续使用WebOperationContext.Current.OutgoingResponse.StatusCode.
作为替代方案,您也可以返回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/en-us/library/dd782273.aspx)而不是CreateTextResponse.如果您将使用此技术生成响应,请不要忘记在流中写入后将流位置设置为0.