I've been searching for ways to use JSON.NET to handle JSON serialization. The best approach that I've found is to create a WCF behavior extension by deriving from BehaviorExtensionElement class. It is described here:
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;
}
}
Then in your 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>