Подтвердить что ты не робот

Страницы помощи ASP.NET Web API: игнорировать определенные свойства

Возможно ли, чтобы генератор образца страницы справки игнорировал определенные свойства определенного типа?

Например, мы используем один и тот же DTO для сообщений об объекте Request and Response для запросов POST и PUT. Когда пользователь выполняет POSTing модели (создание новой записи), им не нужно указывать поле ID.

Но как только его созданный и мы сериализуем новую запись в тело ответа, поле идентификатора включено и возвращается клиенту.

Итак, в примере запроса POST я не хочу, чтобы поле ID отображалось, потому что для почтового запроса это не имеет смысла.

Но образец ответа POST, я хочу, чтобы поле ID отображалось...

Мне известно, что существует атрибут ApiExplorerSettings, который может быть применен к классу или методу... но есть ли что-то подобное для свойства?

Что-то вроде этого было бы здорово:

public class MyDTO
{
    [ApiExplorerSettings(IgnoreForRequestApi = true, IgnoreForResponseApi = false)]
    public int Id { get; set; }

    // Other properties omitted for Brevity...
}
4b9b3361

Ответ 1

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

Относительно обходных решений:

а. Вы можете явно задать необработанный образец для конкретного запроса запроса через расширение SetSampleRequest для HttpRequestMessage. Вы должны увидеть некоторые примеры этого в файле на * Areas\HelpPage\App_Start\HelpPageConfig.cs *.

б. В файле Areas\HelpPage\SampleGeneration\HelpPageSampleGenerator.cs существует метод WriteSampleObjectUsingFormatter, который использует экземпляры форматирования приложения для записи образцов. Здесь вам нужно будет создать новые экземпляры форматирования, имеющие аналогичные настройки, как и ваше обычное приложение (чтобы они отображали точную семантику сериализации/десериализации, на которую обычно реагирует ваше приложение при выполнении реальных запросов), а затем попробуйте скрыть свойства, которые вы хотите. Мы хотим создать новые экземпляры, потому что мы не хотим нарушать нормальное функционирование приложения.

Пример. В случае Json вы можете создать новый экземпляр форматирования Json и предоставить ContractResolver, который может скрывать свойства. Проверьте эту ссылку: http://james.newtonking.com/projects/json/help/html/ConditionalProperties.htm

В случае Xml я не уверен, как мы можем скрыть свойства без использования атрибута IgnoreDataMember, а также быть неинтрузивным.

В настоящее время я предпочел бы вариант 'a' как сравнительно простой обходной путь, чем 'b'.

Ответ 2

Используя следующую аннотацию, я успешно спрятал свойство из поколения!

[ApiExplorerSettings(IgnoreApi = true)]

Ответ 3

ASP.NET WEB API использует Json.NET для JSON и DataContarctSerailizer для форматирования XML, поэтому, если вы добавляете аннотации [JsonIgnore] по свойствам, которые вы не хотите включать в сериализацию, должны работать нормально.