WebApi и использование Swagger

Я реализовал проект WebApi, в котором есть swashbuckle / swagger и пользовательский DelegatingHandler. Я добавил SwaggerAccessMessageHandler, чтобы проверить, сделан ли запрос swagger, и в этом случае я не хочу, чтобы мой пользовательский обработчик запускался.

Я зарегистрировал обработчик сообщений как

GlobalConfiguration.Configuration.MessageHandlers.Add(new SwaggerAccessMessageHandler());

с кастомной реализацией:

public class SwaggerAccessMessageHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (IsSwagger(request))
        {
            var response = request.CreateResponse(HttpStatusCode.Unauthorized);
            return Task.FromResult(response);
        }
        else
        {
            return base.SendAsync(request, cancellationToken);
        }
    }

    private bool IsSwagger(HttpRequestMessage request)
    {
        return request.RequestUri.PathAndQuery.StartsWith("/swagger");
    }
}

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

ОБНОВЛЕНИЕ: Хорошо, я удалил обработчик Swagger. Я добавил новый AuthenticationHandler, который проверяет действительный ключ пользователя в строке запроса входящего запроса. Сейчас я не могу получить доступ к чванству. Есть ли способ обойти это, чтобы, когда я хочу получить доступ к swagger, мой пользовательский обработчик не вызывается?


person wakthar    schedule 14.07.2017    source источник
comment
См. Обновление выше.   -  person wakthar    schedule 14.07.2017


Ответы (1)


У вас пустая страница, потому что вы используете службу REST и ничего не говорите в теле. Ваш браузер вернет заголовок 401, который не виден пользователю. Вы должны изменить ответ на следующие

var response = request.CreateResponse(HttpStatusCode.Unauthorized,"You are not authorized");

Обновление UPDATE: Ok I have removed the Swagger handler for now. I have added a new AuthenticationHandler which checks for a valid userKey in the incoming request querystring. I cannot access swagger now. Is there a way around this so when I want to access swagger my custom handler is not called? Никакие DelegatingHanlers не выполняются в качестве точки входа. Следуя принципам работы конвейера webapi:
 введите описание изображения здесь

Как вы можете заметить, у вас нет контроля над конвейером, чтобы обойти какой-либо обработчик сообщений. В вашем AuthenticationHandler вы должны проверить, содержит ли ваш PathAndQuery чванство, просто выполните следующие

base.SendAsync(request, cancellationToken);
person BRAHIM Kamel    schedule 14.07.2017