Страница справки WebAPI - Документация для свойств возврата или модели параметров / класса

Я использую страницу справки Web API с Web API 2 (5.0) - оба последних пакета Nuget. Мне бы хотелось, чтобы в справочной документации отображались комментарии к свойствам классов, которые являются параметрами или возвращаются в теле HttpResponseMessage.

Например, у меня есть метод контроллера, как это:

public HttpResponseMessage Post([FromBody] MyClassType1 myClass)
{
    // Business logic removed for clarity
    return Request.CreateResponse(HttpStatusCode.OK, new MyClassType2());
}

Я хотел бы, чтобы комментарии XML, которые я имею на MyClassType1 а также MyClassType2 отображаться на странице справки для указанного выше действия.

Куда бы я ни посмотрел, кажется, что это пока не поддерживается. Тем не менее, мне интересно, если кто-нибудь смог заставить это работать, расширив ApiExplorer, добавив в XmlDocumentationProvider и т. Д.?

Я знаю, что комментарии и свойства включены в генерируемый XML-файл, поэтому я мог бы попытаться проанализировать его вручную (все параметры и возвращаемые типы находятся в MyAssemblyName.Models пространство имен, поэтому я подумал, что я мог бы искать узлы XML, у которых есть имя члена, начинающееся с этого пространства имен. Однако я знаю, что встроенные страницы справки веб-API имеют некоторые функции кэширования, поэтому я предпочитаю каким-то образом объединить это с существующими функциями (просто добавьте к ним).

Мне удалось показать типы параметров (только на один слой ниже), обновив шаблон Parameters.cshtml следующим образом:

@using System.Reflection
@using System.Threading
@using System.Web.Http.Description
@using Regency.API.Services.Areas.HelpPage
@model System.Collections.ObjectModel.Collection<ApiParameterDescription>

<table class="help-page-table">
    <thead>
        <tr><th>Name</th><th>Properties</th><th>Description</th><th>Additional information</th></tr>
    </thead>
    <tbody>
        @foreach (ApiParameterDescription parameter in Model)
        {
            string parameterDocumentation = parameter.Documentation ?? "No documentation available.";
            Type parameterType = parameter.ParameterDescriptor.ParameterType;

            // Don't show CancellationToken because it's a special parameter
            if (!typeof (CancellationToken).IsAssignableFrom(parameter.ParameterDescriptor.ParameterType))
            {
                <tr>
                    <td class="parameter-name"><b>@parameter.Name</b></td>
                    <td class="parameter-properties">
                        @foreach (PropertyInfo property in parameterType.GetProperties())
                        {
                            <text>@property.Name : @property.PropertyType.GetFriendlyTypeName()</text>
                            <br/>
                        }
                    </td>
                    <td class="parameter-documentation"><pre>@parameterDocumentation</pre></td>
                    <td class="parameter-source">
                        @switch(parameter.Source)
                        {
                            case ApiParameterSource.FromBody:
                                <p>Define this parameter in the request <b>body</b>.</p>
                                break;
                            case ApiParameterSource.FromUri:
                                <p>Define this parameter in the request <b>URI</b>.</p>
                                if (parameter.ParameterDescriptor.IsOptional)
                                {
                                    <p>This parameter is <b>optional</b>.</p>
                                }
                                break;
                            default:
                                <p>None.</p>
                                break;
                        }
                    </td>
                </tr>
            }
        }
    </tbody>
</table>

где GetFriendlyTypeName() Метод выше реализован так, как показано здесь: Как я могу получить правильное текстовое определение универсального типа, используя отражение?

Однако это не дает мне комментариев от этих классов и не помогает с вложенными типами (например, если бы в моей модели было свойство комплексного типа, свойства этого комплексного типа не отображались бы). И типы все равно недостаточно полезны без их комментариев XML.

Кроме того, это относится только к параметрам, но не к возвращаемым типам, содержащимся в теле HttpResponseMessage. Я смог получить образцы ответов для работы путем реализации ResponseTypeAttribute как показано здесь: автоматически сгенерированные страницы справки с возвращаемым типом HttpResponseMessage, но опять же, которые не дают мне свойств с комментариями XML. Я мог бы использовать отражение, чтобы получить типы аналогично тому, как я снова получал типы параметров, но я действительно хотел бы, чтобы комментарии XML вместе с типами включали вложенные сложные типы.

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

Кто-нибудь смог реализовать что-то похожее на то, что я пытаюсь сделать для параметров или типов возвращаемых данных, предпочтительно для обоих? Или какие-либо идеи, чтобы указать мне в правильном направлении?

2 ответа

Решение

Функция документирования отдельных свойств сложного типа в настоящее время находится в разработке и будет доступна для следующего выпуска. Тем не менее, вы можете получить пакет HelpPage из сборок Nightly и попробовать его. Вы должны иметь возможность обновить этот пакет до существующего проекта веб-API 5.0.

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

Вы можете внести изменения, чтобы включить html в комментарии к документации.

После того, как вы разрешите HTML, вы можете поместить таблицу с информацией о свойствах, куда идет описание тега param для документации XML. Вы также можете просмотреть исходный HTML-код страницы справки, чтобы получить имена атрибутов класса, которые используются для таблиц страниц справки, чтобы ваша таблица использовала тот же CSS, что и все другие таблицы.

Это взлом, но он работает отлично.