当这个“快速一小时”项目出现时,我从没想过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侦听器,我可以直接访问传入的帖子数据。
答案 0 :(得分:1)
如果你想接受任意JSON ,请看这里:
http://social.msdn.microsoft.com/Forums/en-US/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是根据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