0

当这个“快速一小时”项目出现时,我从没想过两天后我会在 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 侦听器,在那里我可以直接访问传入的 post 数据。

4

4 回答 4

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 的地方。

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

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

...并根据这个答案自己解析 JSON 。

于 2012-06-19T20:50:36.540 回答
0

使用 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

于 2012-06-19T20:53:13.350 回答
0

如果你想使用 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" } ));
于 2012-06-19T21:11:39.473 回答
0

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

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

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

于 2012-06-19T21:18:09.377 回答