Pregunta

Migré un método API de una acción MVC estándar a la nueva Beta ASP.NET Web-API y de repente una propiedad de solo lectura ya no se está serializada (ambos que regresan). ¿Es este comportamiento esperado?

Editar: muestra de código agregado

Tengo tanto newtonsoft.json 4.0.8 como system.json 4.0 referenciado 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);
                    }
                }
             }
         }
¿Fue útil?

Solución

los JsonMediaTypeFormatter que se envía con la versión beta usa un serializador que no admite propiedades de solo lectura (ya que no iban a la vuelta correctamente). Estamos planeando abordar esto para la próxima Realese.

Mientras tanto, podría usar un JSON personalizado MediaTypeFormatter implementación que usa json.net (hay una disponible aquí) en lugar del formateador incorporado.

Actualizar: También mira el blog de Henrik sobre enganchar un formateador JSON.NET: http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx

Otros consejos

No sé si este 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 este es un error para un parámetro de salida. Y aquí hay un ejemplo que ilustra el problema:

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"}

Entonces, si la propiedad no tiene un setter público, no está serializado, lo que no parece normal como el Product La clase se usa como salida en este caso.

Sugeriría abrir un boleto de conexión para que Microsoft pueda solucionar esto antes de la versión o al menos decir que esto es por diseño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top