WCF REST - 发布JSON字符串

时间:2012-06-19 20:43:00

标签: c# json wcf rest post

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

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

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

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

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

外部应用程序将JSON字符串发布到此,并在必要时解析和处理的底层代码中。

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

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

4 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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

在“Anonymous和Weakly-Typed JSON Objects”部分中查看: http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization

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

UPD:看一下这个链接

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

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

答案 2 :(得分: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" } ));

答案 3 :(得分:0)

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

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

找到“邮件格式选择”部分。只需确保Accept header设置为application / json