2012-06-19 37 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