2012-06-19 38 views
0

当这种“快速1小时”项目上来我从来没有想到,两天后我会#2问这个问题。不过,在这里我们去...WCF REST - 发布JSON字符串

我有很多的当前调用一个WCF REST服务,返回JSON GET方法外部客户端应用程序(Java,Perl,PHP,C#)。这工作正常,并且完全按照您的预期执行。

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

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

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

外部应用的JSON字符串张贴到这一点,并在底层代码中,我们分析和必要的处理。

所以现在的问题是一个非常简单的,怎么会变成这样从一个服务接口的角度实现的?我能处理的服务代码中的JSON字符串的序列化/管理没有任何问题,问题是如何得到JSON的这个字符串放进摆在首位的服务代码。

在我想这些不能用“正常”的WCF REST接口来完成的那一刻,而我将必须实现一个较低的水平HTTP监听器,我可以直接访问传入后的数据。

+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) 
{ 
    .... 
} 

...并解析JSON自己,根据this answer

+0

增加了一些问题的澄清:....这将如何从服务接口的角度来实现?我能处理的服务代码中的JSON字符串的序列化/管理没有任何问题,问题是如何得到JSON的这个字符串放进摆在首位的服务代码。 – MrEyes

+0

我还不清楚。尽管我提出了一些关于我的建议的更新。 – Cheeso

+0

增加了进一步的说明我认为我把事情弄糊涂了,因为它不是任意的JSON,只有一个结构会进来,但是有,并且从来不会有与之关联的C#类。所以我们打算使用json.net来处理序列化。 – MrEyes

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

+0

增加了对这个问题的一些澄清:....这将如何从服务接口的角度来实现?我能处理的服务代码中的JSON字符串的序列化/管理没有任何问题,问题是如何得到JSON的这个字符串放进摆在首位的服务代码。 – MrEyes

+0

因此,您需要手动解析服务器上的Json对象。例如,映射到JSON被POST的URL的方法,可以将字符串作为参数,然后使用Json.NET可以解析任何Json结构。但是当你有一些预定义的Json对象“模式”时,它更容易解析。 – Regfor

+0

不存在与json对象关联的类没有问题。手动解析,匿名类型,甚至直接从传入的Json字符串中直接提取所需信息 – Regfor

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" })); 
0

一个示例代码。如果它是一个.NET 4.0 WCF项目,然后JSON被直接支撑:

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

找到“消息格式选择”部分。只要确保Accept头被设置为应用程序/ json

+0

请说明降级。这使WCF REST服务接受并处理JSON。如果我误解了这个问题,请澄清。 – Quintium

+0

问题是询问如何接受与每个客户端格式不同的JSON。如果所有客户都以相同的格式发布JSON,那么简单的内置支持就可以工作。 –

+0

谢谢。错过了他无法用C#类来完成的问题(与客户端的传递方式无关,似乎是相同的)。然后是的,我的回答不正确。看起来很奇怪,它不能使用。 – Quintium