【问题标题】:WCF REST - Posting a JSON stringWCF REST - 发布 JSON 字符串
【发布时间】:2012-06-19 20:42:59
【问题描述】:

当这个“快速一小时”项目出现时,我从没想过两天后我会在 Stackoverflow 上问这个问题。但是,我们开始...

我有许多外部客户端应用程序(java、perl、php、c#)当前在返回 JSON 的 WCF REST 服务上调用 GET 方法。这工作正常,并且完全按照您的预期实施。

我现在需要这些相同的应用程序将 JSON POST 到原始服务接口上的新方法中。 C# 应用程序使用 WebClient,Perl 和 PHP 使用 CURL,Java 使用一些我不参与的魔法。它们都将 JSON 作为字符串生成,然后调用基本的 HTTP 功能将数据 POST 到端点。

问题是我们使用的 JSON 没有与之关联的 C# 类(出于无法更改的原因),因此我们打算使用字符串和 json.net 来解析/处理传入的数据.例如,端点可以是:

https://magic.myserver.com/service/dataaggregator/

外部应用程序将 JSON 字符串发送到此,并在我们根据需要解析和处理的底层代码中。

所以问题是一个非常简单的问题,从服务接口的角度来看,这将如何实现?我可以毫无问题地处理服务代码中的 JSON 字符串的序列化/管理问题是我首先如何将该 JSON 字符串放入服务代码中。

目前我认为这些不能使用“普通”WCF REST 接口来完成,而是我必须实现一个较低级别的 HTTP 侦听器,以便我可以直接访问传入的帖子数据。

【问题讨论】:

  • 就其价值而言,没有所谓的“快速一小时项目”。 :)

标签: c# json wcf rest post


【解决方案1】:

如果您想接受任意 JSON,请看这里:

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/071f73bb-e141-4a68-ae61-05635382934f

如果这不是您想要的,那么您可能需要在问题中阐明您的目标。

另请参阅https://stackoverflow.com/a/7360619https://stackoverflow.com/a/2330219

服务接口是这样的:

[OperationContract]
public Whatever  MyMethod(DataPacket rawJSON)
{ 
     ....
}

[DataContract]
public class DataPacket
{
  [DataMember]
  public JsonDictionary Registration { get; set; }
}

...其中 JsonDictionary 是根据 this answer 定义的。

您还可以编写方法来接受流,如下所示:

[OperationContract]
public Whatever  MyMethod(Stream rawJSON)
{ 
     ....
}

...并根据this answer 自行解析 JSON。

【讨论】:

  • 对问题添加了一些说明: ....从服务接口的角度来看,这将如何实现?我可以毫无问题地处理服务代码中 JSON 字符串的序列化/管理问题是我如何首先将该 JSON 字符串放入服务代码中。
  • 我还是不清楚。不过,我对我的建议做了一些更新。
  • 添加了进一步的说明 我认为我混淆了一些事情,因为它不是任意的 JSON,只有一个结构会出现,但存在并且永远不会存在与之关联的 C# 类。所以我们打算使用 json.net 来处理序列化
【解决方案2】:

通过 ASP.NET WebAPI 使用匿名和弱类型 JSON 对象

请参阅“匿名和弱类型 JSON 对象”部分: http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization

实际上它使用 JSON.NET,因此您可以使用较旧的 .NET REST 技术来实现。但我确信在处理成熟的 JSON 解析器时(不仅在 .NET 上),可以像 Json.NET 一样解析任意 JSON 结构

UPD:看看这个链接

http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx

您甚至可以将 Json.NET 中的 JObject 类作为动态处理。解析Json字符串可以产生JObject

【讨论】:

  • 对问题添加了一些说明: ....从服务接口的角度来看,这将如何实现?我可以毫无问题地处理服务代码中 JSON 字符串的序列化/管理问题是我如何首先将该 JSON 字符串放入服务代码中。
  • 因此,您需要在服务器上手动解析您的 Json 对象。例如映射到发布 Json 的 URL 的方法,可以将字符串作为参数,然后使用 Json.NET,您可以解析任何 Json 结构。但是当你有一些预定义的 Json 对象“模式”时,就更容易解析了。
  • 而且没有与json对象关联的类也不是问题。手动解析、匿名类型,甚至直接从传入的 Json 字符串中提取只需要的信息
【解决方案3】:

如果是 .Net 4.0 WCF 项目则直接支持 JSON:

http://msdn.microsoft.com/en-us/library/ee354381.aspx

找到“消息格式选择”部分。只需确保 Accept 标头设置为 application/json

【讨论】:

  • 请解释降级。这使得 WCF REST 服务接受并处理 JSON。如果我误解了这个问题,请澄清。
  • 问题是询问如何从每个客户端接受不同格式的 JSON。如果所有客户端都以相同的格式发布 JSON,那么简单的内置支持就可以了。
  • 谢谢。错过了他不能用 C# 类做的问题(与客户如何传递它无关,这似乎是一样的。)然后是的,我的答案不正确。只是看起来很奇怪,它不能使用。
  • 在编辑问题之前情况更清楚了。它曾经声明“问题是我们希望对多个 JSON 模型使用单一服务方法,因此相同的服务方法可能接受不同的 JSON 结构,然后在服务下的代码中,我们确定正在使用的数据模型并相应地处理。 "
【解决方案4】:

如果你想使用 HttpListener,这里有一个示例代码(使用 Json.Net

HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://*:8080/");
listener.Start();
Task.Factory.StartNew(() =>
{
    while (true)
    {
        HttpListenerContext context = listener.GetContext();
        ThreadPool.QueueUserWorkItem((o) =>
        {
            HttpListenerContext ctx = (HttpListenerContext)o;
            StreamReader rdr = new StreamReader(ctx.Request.InputStream);
            var postData = rdr.ReadToEnd();
            var dynJson = (JObject)JsonConvert.DeserializeObject(postData);

            foreach (var ch in dynJson.Children())
            {
                Console.WriteLine(ch);
            }

        }, context);
    }
});

Thread.Sleep(1000);
WebClient web = new WebClient();
web.UploadString("http://localhost:8080", 
                  JsonConvert.SerializeObject(new { ID=1,Name="name1" } ));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    相关资源
    最近更新 更多