当前位置: 首页 > 面试题库 >

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

丘浩宕
2023-03-14
问题内容

序列化/反序列化实体时可以改写默认的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)非常有趣,但是对于您的特殊问题,它更容易解决方法。

如果您已经使用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。



 类似资料:
  • 问题内容: 我想用JSON.NET替换默认的WCF JSON(对于所有数据类型)序列化。我在网上搜索了所有内容,却找不到有效的解决方案。 这是我的对象: 这是我的WCF函数: 这是Global.asax中的代码: 这是Web.Config: 和服务部分: 最后,这是启动URL时得到的: “ http:// localhost:30000 / Brands / Get ” JSON答案显然会忽略JS

  • 问题内容: 我试图在我的中设置全局序列化器设置。 使用以下代码序列化对象时,是否不使用全局序列化程序设置? 是否可以像这样设置全局序列化程序设置,或者我遗漏了什么? 问题答案: 设置成功了。

  • 问题内容: 我的类DataType有一个JsonConverter。当在Json中使用纯字符串作为DataType类型的属性的值时,我想做一些特殊的处理。在值是“完整”对象的情况下,我想进行“常规”反序列化。 这是我的尝试 但这不起作用,因为这行:DataType dataType = serializer.Deserialize(reader); 导致无限递归。 可以通过某种方式轻松完成吗?(无

  • 问题内容: 如何为MySQL Datetime列设置默认值? 在SQL Server中为。MySQL的等效功能是什么?如果这是一个因素,我正在使用MySQL5.x。 问题答案: 重要编辑: 自 MySQL 5.6.5起 ,现在可以使用DATETIME字段实现此目的,请看下面的另一篇文章 … 以前的版本无法在DATETIME做到这一点… 但是您可以使用TIMESTAMP来做到这一点: 注意:如果您定

  • 我尝试使用liquibase使用liquibase“addDefaultValue”语法将我的列的默认值设置为null: 但是向myTable插入新行显示默认值仍然设置为“false”,就像以前一样。所以liquibase更改集不起作用。 如何设置列默认值为null与liquibase?

  • 通常所有的默认配置都可以。但是现在我需要将我的应用程序部署到Weblogic 12.2服务器,我面临一些关于持久性的问题。 我只是想知道如何设置持久化单元的JPA EntityManagerFactory不默认。因为通过启动应用程序,我可以看到这些日志: 所以我不确定weblogic是使用默认的持久化单元(eclipselink)还是真正的Hibernate。所以我想在我的应用程序中的任何地方明确