[英]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/7360619和https://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.