Операции фильтрации на странице справки WebApi - PullRequest
0 голосов
/ 13 июня 2019

У меня есть вызов действия «Аутентификация», и в WebApiConfig я добавил карту для вызова этого действия.

config.Routes.MapHttpRoute(
        name: "LoginApi",
        routeTemplate: "api/login",
        defaults: new { controller = "Login", action = "Authenticate" }
);

Теперь в справочной странице я получил две операции для одного и того же действия и хочу толькоодин.

POST api/Login/Authenticate

POST api/Login

Как я могу отфильтровать / скрыть операции в HelpPage и показать только одну?Например:

POST api/Login

Я не могу использовать [ApiExplorerSettings(IgnoreApi = true)], потому что он скрывает два действия.

Это пакет, который я использую: Microsoft.AspNet.WebApi.HelpPage 5.2.7

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

В файле ApiGroup.cshtml: enter image description here

Существует foreach, в котором вы можете скрыть нужные операции, например:

@foreach (var api in Model)
{
    string[] paths = new string[] { "api/Login/authenticate" };
    if(paths.Contains(api.RelativePath))
    { continue; }

    <tr>
        <td class="api-name">
           <a href="@Url.Action("Api", "Help", 
              new { apiId = api.GetFriendlyId() })">
              @api.HttpMethod.Method @api.RelativePath
           </a></td>
        <td class="api-documentation">
        @if (api.Documentation != null)
        {
            <p>@api.Documentation</p>
        }
        else
        {
            <p>No documentation available.</p>
        }
        </td>
    </tr>
}

В этом блоке я добавил этот код:

string[] paths = new string[] { "api/Login/authenticate" };
if(paths.Contains(api.RelativePath))
{ 
   continue; 
}

С помощью этого вы можете проверить, что вы хотите показать.

0 голосов
/ 13 июня 2019

Вам не нужен особый маршрут.DefaultApi будет направлять ваше действие по соглашению .Удалите свой собственный LoginApi маршрут и используйте метод соглашения в вашем контроллере

public class LoginController : ApiController
{
    public void Post()
    {
        // authenticate here
    }
}

или, если вы настаиваете на присвоении имени действию Authenticate, вы можете использовать вариацию маршрутизации по HTTP-глаголу

public class LoginController : ApiController
{
    [HttpPost]
    public void Authenticate()
    {
        // authenticate here
    }
}

Это заставит API Explorer сформировать нужную вам страницу справки: ASP.NET Web Api Help Page

Редактировать

Для поддержки нескольких методов действия, которые используют один и тот же глагол HTTP, вы должны настроитьмаршрутизация по имени действия аналогична той, что вы делали, но я не вижу параметра {action} в вашем маршруте.Это должно быть:

config.Routes.MapHttpRoute(
    name: "LoginApi",
    routeTemplate: "api/Login/{action}",
    defaults: new { controller = "Login", action = "Authenticate" }
);

Если указать действие по умолчанию, как указано выше, URL /api/Login будет правильно перенаправлен на LoginController.Authenticate, однако на странице справки действие будет отображаться как POST api/Login/Authenticate, посколькуApiExplorer почему-то не распознает действие по умолчанию.Чтобы исправить это, я бы предпочел избежать взлома справочной страницы, как вы сделали в своем собственном ответе, потому что она может откусить вас назад.Вместо этого вы можете принудительно задать маршрут для действия по умолчанию, используя RouteAttribute.Код контроллера будет выглядеть следующим образом:

public class LoginController : ApiController
{
    [HttpPost]
    [Route("api/Login")]
    public void Authenticate()
    {
        // authenticate here
    }

    [HttpPost]
    public void Register()
    {
        // register here
    }
}

На странице справки будет отображаться:

POST api / Login

POST api / Login / Register

...