加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:47:51 所属栏目:百科 来源:网络整理
导读:当Serialize / DeSerialize实体并使用JSON.NET时,是否可以覆盖默认的WCF DataContractSerializer行为? 我有以下服务合同来处理城市实体。出于设计原因,City实体有IsReference = true,因此默认的DataContractSerializer会引发错误。 对于“GET”方法,我
当Serialize / DeSerialize实体并使用JSON.NET时,是否可以覆盖默认的WCF DataContractSerializer行为?

我有以下服务合同来处理城市实体。出于设计原因,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)
    {
    }
}

非常感谢

霍山

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

如果您已经使用消息类型返回结果使用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.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。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读