2012-03-22 18 views
8

Estoy tratando de usar el paquete nuget NETFx Json.NET MediaTypeFormatter para cambiar el DataContractJsonSerializer predeterminado en mi servicio WCF REST (framework 4.0). Descargué el paquete en mi proyecto y agregué las siguientes líneas de código en el archivo Global.asax.Serializador JSON.NET para WCF REST Services

void Application_Start(object sender, EventArgs e) 
    { 
     RegisterRoutes(); 

     // Create Json.Net formatter serializing DateTime using the ISO 8601 format 
     var serializerSettings = new JsonSerializerSettings(); 
     serializerSettings.Converters.Add(new IsoDateTimeConverter()); 

     var config = HttpHostConfiguration.Create(); 
     config.Configuration.OperationHandlerFactory.Formatters.Clear(); 
     config.Configuration.OperationHandlerFactory.Formatters.Insert(0, new JsonNetMediaTypeFormatter(serializerSettings)); 
    } 

Pero cuando ejecuto el servicio, todavía utiliza el DataContractJsonSerilizer para la serialización. Debajo está la clase que estoy regresando de mi servicio.

[DataContract] 
public class SampleItem 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string StringValue { get; set; } 

    [DataMember] 
    public DateTime DateTime { get; set; } 
} 

A continuación se muestra la respuesta del servicio en el Fiddler.

enter image description here

Se puede ver que el DateTime no está en formato ISO que he especificado en serializerSettings en el código de seguridad. Esto me dice que el serializador JSON.NET no se usa para serializar los objetos.

Agradecería cualquier ayuda.

Respuesta

6

Me siento tonto después de pensar la respuesta. Ocurre a veces :). Tuve que agregar la configuración a la RouteTable. A continuación se muestra el código en Global.asax

public class Global : HttpApplication 
{ 
    void Application_Start(object sender, EventArgs e) 
    { 
     RegisterRoutes(); 
    } 

    private void RegisterRoutes() 
    { 
     // Create Json.Net formatter serializing DateTime using the ISO 8601 format 
     var serializerSettings = new JsonSerializerSettings(); 
     serializerSettings.Converters.Add(new IsoDateTimeConverter()); 

     var config = HttpHostConfiguration.Create().Configuration; 
     config.OperationHandlerFactory.Formatters.Clear(); 
     config.OperationHandlerFactory.Formatters.Insert(0, new JsonNetMediaTypeFormatter(serializerSettings)); 

     var httpServiceFactory = new HttpServiceHostFactory 
            { 
             OperationHandlerFactory = config.OperationHandlerFactory, 
             MessageHandlerFactory = config.MessageHandlerFactory 
            }; 

     RouteTable.Routes.Add(new ServiceRoute("Service1", httpServiceFactory, typeof(Service1))); 
    } 
} 

Espero que ayude a alguien si se topan con el mismo escenario.

+2

En realidad me sucede a un escenario similar, pero mis servicios WCF están alojados en el Servicio de Windows. El código anterior arroja la siguiente excepción: "System.InvalidOperationException: 'ServiceHostingEnvironment.EnsureServiceAvailable' no se puede invocar dentro del entorno de alojamiento actual. Esta API requiere que la aplicación de llamada se aloje en IIS o WAS." ¿Alguna idea? –

Cuestiones relacionadas