一尘不染

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

json

序列化/反序列化实体时可以改写默认的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)
    {
    }
}

非常感谢

胡萨姆


阅读 180

收藏
2020-07-27

共1个答案

一尘不染

扩展编码器和序列化器的使用(请参阅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);
}

如果出现错误(如HttpStatusCode.UnauthorizedHttpStatusCode.Conflict)或在其他情况下需要设置HTTP状态代码(如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。

2020-07-27