Как проверить, существует ли контроллер и / или действие в качестве допустимой конечной точки из промежуточного программного обеспечения? - PullRequest
0 голосов
/ 16 апреля 2020

Мне нужно из промежуточного ПО выяснить, указывает ли маршрут или контекст на действительную конечную точку в моем API. Я хочу сделать это для того, чтобы отправить действительный json отформатированный ответ об ошибке вместо пустого сообщения об ошибке по умолчанию, которое отправляет API.

Альтернативное решение, которое выясняет, что конечная точка ничего не дала, тоже хорошо. Моей первой мыслью было использование промежуточного программного обеспечения, но, возможно, отправка ошибки с резервным контроллером тоже работает?

1 Ответ

0 голосов
/ 16 апреля 2020

Я хотел бы дать ответ на свой вопрос, так как я нашел способ вручную проверить, существует ли маршрут. Это было то, о чем я не думал в то время, так как я не понимал, что вы можете получить информацию о вашем API через зависимость.

Способ, которым я сделал это сейчас, состоит в том, чтобы использовать IActionDescriptorCollectionProvider поставщик. Это позволит мне получать все текущие маршруты в API. Используя это, я создал следующее промежуточное программное обеспечение:

public async Task InvokeAsync(HttpContext context)
{
    var path = context.Request.Path.Value;
    var routes = _actionDescriptorCollectionProvider.ActionDescriptors.Items.Select(ad => $"/{ad.AttributeRouteInfo.Template}").ToList();

    if (!routes.Any(route => path.Equals(route, StringComparison.InvariantCultureIgnoreCase))) {
        context = await context.HandleRequest(HttpStatusCode.NotFound, "RouteNotFound", "De server heeft geen geldige actie voor de gegeven route.");
        return;
    }

    await _next(context);
}

Это полностью позволяет мне ответить пользовательской ошибкой (это использует HandleRequest (), которая является моим собственным расширением), и обработать остальное в Интерфейс.

Я нашел другой способ решить эту проблему, используя предварительно инициализированную документацию API. Я не уверен, как это назвать, но добавление следующего кода в файл csproj создает XML, который дает те же преимущества:

<NoWarn>$(NoWarn);1591</NoWarn>
<DocumentationFile>Files\Documentation\$(Configuration)_$(AssemblyName)_doc.xml</DocumentationFile>

Это означает, что XML был проанализирован Конечно.

Я все еще ищу различные решения, возможно, лучшие, если есть проблемы с этим.

...