我很想知道,因为我没有在任何地方找到它 -
基于Json的Web服务可以与Json.NET库一起使用吗?
换句话说,有没有办法让JSON.NET反序列化webservice的请求的JSON对象而不是.NET默认的Serializer?
这样做的一种方法可能是声明WebMethod接受普通字符串,然后使用JSON.NET的JsonConvert将原始字符串反序列化为正确的对象,但这意味着请求的语法(来自客户端)会有点尴尬。
还有其他方法或建议吗?
谢谢,
米奇
答案 0 :(得分:3)
AFAIK,您必须手动执行此操作,方法是让您的Web服务将字符串作为参数并返回字符串作为响应。如果你使用WCF,那么事情会有很大的不同,因为与传统的ASMX Web服务相比,体系结构更具可扩展性,顺便说一下,它现在被认为是一种不推荐使用的技术。
答案 1 :(得分:3)
我一直在寻找使用JSON.NET来处理JSON序列化的方法。我发现的最佳方法是通过派生BehaviorExtensionElement类来创建WCF行为扩展。这里描述:
http://json.codeplex.com/discussions/209865
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Web;
using System.ServiceModel.Configuration;
using System.ServiceModel.Dispatcher;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public class JsonNetBehaviorExtension : BehaviorExtensionElement
{
public class JsonNetBehavior : WebHttpBehavior
{
internal class MessageFormatter : IDispatchMessageFormatter
{
JsonSerializer serializer = null;
internal MessageFormatter()
{
serializer = new JsonSerializer();
}
public void DeserializeRequest(Message message, object[] parameters)
{
throw new NotImplementedException();
}
public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
{
var stream = new MemoryStream();
var streamWriter = new StreamWriter(stream, Encoding.UTF8);
var jtw = new JsonTextWriter(streamWriter);
serializer.Serialize(jtw, result);
jtw.Flush();
stream.Seek(0, SeekOrigin.Begin);
return WebOperationContext.Current.CreateStreamResponse(stream, "application/json");
}
}
protected override IDispatchMessageFormatter GetReplyDispatchFormatter(OperationDescription operationDescription, ServiceEndpoint endpoint)
{
return new MessageFormatter();
}
}
public JsonNetBehaviorExtension() { }
public override Type BehaviorType
{
get
{
return typeof(JsonNetBehavior);
}
}
protected override object CreateBehavior()
{
var behavior = new JsonNetBehavior();
behavior.DefaultBodyStyle = WebMessageBodyStyle.WrappedRequest;
behavior.DefaultOutgoingResponseFormat = WebMessageFormat.Json;
behavior.AutomaticFormatSelectionEnabled = false;
return behavior;
}
}
然后在你的web.config
中<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="webHttpJson" type="YourNamespace.JsonNetBehaviorExtension, YourAssembly"/>
</behaviorExtensions>
</extensions>
<behaviors>
<endpointBehaviors>
<behavior name="NewtonsoftJsonBehavior">
<webHttp helpEnabled="true" automaticFormatSelectionEnabled="true"/>
<webHttpJson/>
</behavior>
</endpointBehaviors>
<behaviors>
答案 2 :(得分:2)
用于REST Web服务的新WCF Web API提供了一种将Json.NET用作序列化程序的方法。