ASP.NET Web-API не сериализует свойство только для чтения - PullRequest
6 голосов
/ 21 февраля 2012

Я перенес метод API из стандартного действия MVC в новую бета-версию asp.net Web-API, и внезапно свойство только для чтения больше не сериализуется (оба возвращают JSON).Это ожидаемое поведение?

Редактировать: Добавлен пример кода

У меня есть и Newtonsoft.Json 4.0.8, и System.Json 4.0, на которые ссылаются через пакеты 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);
                    }
                }
             }
         }

Ответы [ 2 ]

10 голосов
/ 23 февраля 2012

JsonMediaTypeFormatter, поставляемый с бета-версией, использует сериализатор, который не поддерживает свойства, доступные только для чтения (поскольку они не будут обрабатывать данные в обоих направлениях).Мы планируем решить эту проблему для следующего выпуска.

В то же время вы можете использовать собственную реализацию JSON MediaTypeFormatter, которая использует Json.NET (есть одна доступная здесь )встроенного форматера.

Обновление: Также ознакомьтесь с блогом Хенрика о подключении форматера JSON.NET: http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx

4 голосов
/ 22 февраля 2012

Я не знаю, ожидаемое ли это поведение или нет.Я бы сказал, что это ожидается для входных параметров (потому что вы не можете установить их значения), но не для выходных параметров.Так что я бы сказал, что это ошибка для выходного параметра.И вот пример, иллюстрирующий проблему:

Модель:

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

Контроллер:

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

Запрос:

api/products/5

Результат:

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

Таким образом, если свойство не имеет общедоступного установщика, оно не сериализуется, что не кажется нормальным, поскольку в этом случае в качестве вывода используется класс Product.

Iпредложил бы открыть заявку на подключение, чтобы Microsoft могла исправить это до выпуска, или, по крайней мере, сказать, что это сделано специально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...