【问题标题】:REST WCF service - differences data input format (JSON/XML)REST WCF 服务 - 差异数据输入格式 (JSON/XML)
【发布时间】:2015-05-19 07:16:55
【问题描述】:

也许这是一个愚蠢的问题,但我需要一些帮助。

我正在使用 WCF 来提供宁静的服务。用户通过 http post 请求将数据发送给我的方法。

我已经完成了一种接收表示 json 格式数据的字符串的方法。所以,我只是解析它并创建我的对象来读取。

我的愚蠢问题是:如何设置另一种方法来接收 XML 格式的数据输入?我的意思是,对于 json,我只希望解析一个字符串。对于 XML?

这是我第一次遇到这个问题,我想学习如何以一种干净的方式来解决这个问题(比如 json 的字符串)。

你能帮帮我吗?

更新: 例如,我有这个示例方法:

    [OperationContract]
    [WebInvoke(UriTemplate = "Patient/Add", Method = "POST")]
    int AddPatient(Patient patient);

我看到输入是一个自定义类......所以,我认为客户可以向我发送一个代表这个类的 xml.. 或者不?我可以像这样简单地管理输入吗?

【问题讨论】:

  • 我不知道它在 c# 中是如何工作的,但通常当您想要指定休息服务的可接受格式时,您会依赖媒体类型。在您的 json 服务中,您应该指定它使用“application/json”,而在另一个服务中,您将指定“application/xml”
  • 我已经这样做了:[WebGet(UriTemplate = "Erogazioni?retista={codret}&lotto={nLotto}&H={hashedString}", ResponseFormat = WebMessageFormat.Xml)] 用于输出格式。 ..但是对于输入?你有一些例子,还有其他语言吗?
  • 你的意思是你想要第二种方法,让你接收xml格式的数据?
  • @Zanuff 是的,我的意思是这个! :)
  • 好吧,在 Java 中,您只需对指定可接受媒体类型的方法进行注释:@POST @Consumes("application/json") public void getDataInJSON(Date automaticallyParsedDate)。但是,有一个库 (Jersey) 负责根据您指定的媒体类型对数据进行编组/解组。我不知道如何在 c# 中完成。

标签: c# json xml wcf rest


【解决方案1】:

我个人使用这样的东西。

    [OperationContract]
    [WebInvoke(Method = "POST",
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        UriTemplate = "json")]
    void AddUsefulLinkJson(UsefulLinksWCF.Models.UsefulLink link);

    [OperationContract]
    [WebInvoke(Method = "POST",
        RequestFormat = WebMessageFormat.Xml,
        ResponseFormat = WebMessageFormat.Xml,
        UriTemplate = "xml")]
    void AddUsefulLinkXml(UsefulLinksWCF.Models.UsefulLink link);

因此,当您使用客户端时,您可以像这样请求 json 或 xml 中的数据:

http://www.something.com/UsefulLinks/rest/xml

http://www.something.com/UsefulLinks/rest/json

MSDN 上有一篇关于从 NET 4.0 开始的格式选择的好文章:

https://msdn.microsoft.com/en-us/library/ee476510%28v=vs.100%29.aspx

启用后,自动格式化会选择返回响应的最佳格式。它通过按顺序检查以下内容来确定最佳格式:

请求消息的 Accept 标头中的媒体类型。

请求消息的内容类型。

操作中的默认格式设置。

WebHttpBehavior 中的默认格式设置。

【讨论】:

  • 如果这是正确的做法,我已准备好编辑我的帖子。因此,使用这段代码,我在这两种情况下都像自定义类一样管理,但客户能够以他们喜欢的格式向我发送。一个问题:如果客户端给我一个代表 json 的字符串,我得到它已经为输入类解析了,对吧?
  • 是的。客户端需要使用正确的 Uri 发送正确的格式,它将被反序列化到您的类。
  • 所以这不是我的工作,是 wcf 做的,好吧。但是..阅读这个requestFormat...我现在问...这真的有用吗?或者,如果我只写了一张海报而没有指定 requestFormat.. 我可以毫无问题地管理两者吗?还是分开比较好?
  • 这段代码是很久以前写的。根据 msdn,从 NET 4.0 开始,您可以使用 AutomaticFormatSelectionEnabled 属性告诉 WCF 根据请求消息使用格式。更多信息msdn.microsoft.com/en-us/library/ee476510%28v=vs.100%29.aspx
  • 那么,在您看来,哪个是最佳选择?另一个问题(最后一个):如果我想在列表中添加更多 UserfulLink,我可以简单地写 void AddUsefulLinkXml(List link) 吗?
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多