2012-02-21 18 views
6

Migré un método API de una acción MVC estándar a la nueva API asp.net Web-API y de repente una propiedad de solo lectura ya no se serializa (ambas devuelven JSON). ¿Es este comportamiento esperado?ASP.NET Web-API sin serializar la propiedad de solo lectura

Editar: Añadido ejemplo de código

tengo tanto Newtonsoft.Json 4.0.8 y 4.0 System.Json referenciada a través de paquetes NuGet

 public IQueryable<Car> Gets() 
     { 
      return _carRepository.GetCars(); 
     } 

     public class Car 
     { 
      public IEnumerable<Photo> Photos 
      { 
       get { return _photos; } 
      } 

      public string PreviewImageUrl // No longer serialized 
      { 
       get 
       { 
        var mainImage = Photos.FirstOrDefault(o => o.IsMainPreview) Photos.FirstOrDefault(); 
         return mainImage != null ? mainImage.Url : (string.Empty); 
        } 
       } 
      } 
     } 
+0

no se esperaba. podrías publicar un código que repree el problema – marcind

+0

¿Qué serializador JSON estás usando? –

Respuesta

10

El JsonMediaTypeFormatter que se envía con el Beta usa un serializador que no admite propiedades de solo lectura (ya que no se redirigen correctamente). Estamos planeando abordar esto para la próxima edición.

Mientras tanto, podría utilizar una implementación personalizada de JSON MediaTypeFormatter que use Json.NET (hay una disponible here) en lugar del formateador incorporado.

Actualización: También puedes ver el blog de Henrik acerca conectar un formateador JSON.NET: http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx

+1

Acaba de actualizar a la versión RC y esto todavía parece ser un problema. ¿Es curioso si las cosas cambiarán antes del lanzamiento final o simplemente no debemos esperar que las propiedades de solo lectura sean serializadas? ¡Gracias! –

+0

Puede probar la última compilación nocturna (instrucciones: http://aspnetwebstack.codeplex.com/discussions/353867). Además, asegúrese de que realmente haya desinstalado los bits Beta de su sistema. Si todavía es un problema, podría publicar una reproducción aquí: http://aspnetwebstack.codeplex.com/. Gracias. – marcind

+0

Había desinstalado la versión beta e instalado el RC, pero olvidé actualizar los paquetes de mi proyecto con nuget, así que todavía estaba usando bits beta. Después de la actualización, la propiedad de solo lectura se serializa usando JSON, pero no como XML. Para mis propósitos, JSON es todo lo que necesito, así que estoy bien, pero parece que debería comportarse igual con la serialización de XML. –

4

No sé si esto es un comportamiento esperado o no. Diría que esto se espera para los parámetros de entrada (porque no puede establecer sus valores) pero no para los parámetros de salida. Entonces diría que esto es un error para un parámetro de salida. Y he aquí un ejemplo que ilustra el tema:

Modelo:

public class Product 
{ 
    public Product() 
    { 
     Prop1 = "prop1 value"; 
     Prop2 = "prop2 value"; 
     Prop3 = "prop3 value"; 
    } 

    public string Prop1 { get; set; } 

    [ReadOnly(true)] 
    public string Prop2 { get; set; } 

    public string Prop3 { get; protected set; } 
} 

controlador:

public class ProductsController : ApiController 
{ 
    public Product Get(int id) 
    { 
     return new Product(); 
    } 
} 

Solicitud:

api/products/5 

Resultado:

{"Prop1":"prop1 value","Prop2":"prop2 value"} 

Por lo tanto, si la propiedad no tiene un setter público, no está serializada, lo que no parece normal ya que la clase Product se usa como salida en este caso.

Sugiero abrir un boleto de conexión para que Microsoft pueda arreglar esto antes del lanzamiento o al menos decir que esto es por diseño.

Cuestiones relacionadas