簡體   English   中英

WCF REST-發布JSON字符串

[英]WCF REST - Posting a JSON string

當這個“快速一小時”項目出現時,我從未想到兩天后我會在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偵聽器,以便可以直接訪問傳入的發布數據。

如果要接受任意JSON ,請查看此處:

http://social.msdn.microsoft.com/Forums/zh-CN/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。

與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

如果您想使用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" } ));

如果它是.Net 4.0 WCF項目,則直接支持JSON:

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

找到“消息格式選擇”部分。 只要確保Accept標頭設置為application / json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM