WebApi和使用Swagger

3

我已经实现了一个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");
    }
}

但是,当我使用 /swagger 访问我的 WebApi 时,我得到的是一个空白页面而不是 Swagger UI。
更新:好吧,我现在已经删除了 Swagger 处理程序。 我添加了一个新的身份验证处理程序,它检查传入请求查询字符串中的有效 userKey。现在我无法访问 Swagger。 有没有办法绕过这个问题,使得当我想要访问 Swagger 时,我的自定义处理程序不会被调用?

请参见上面的更新。 - wakthar
1个回答

3
你得到了一个空白页面,因为你正在使用REST服务并且没有在正文中输入任何内容。你的浏览器会返回一个401标头,这对用户来说是不可见的。 你必须将响应更改为以下内容:
var response = request.CreateResponse(HttpStatusCode.Unauthorized,"You are not authorized");

更新: 我现在已经删除了Swagger处理程序。我添加了一个新的AuthenticationHandler,它检查传入请求查询字符串中是否有有效的userKey。我现在无法访问Swagger。有没有办法绕过这个自定义处理程序,以便在我想要访问Swagger时不会调用它? 没有DelegatingHanlers作为入口点执行。 按照webapi Pipeline的工作方式: enter image description here 正如您可能注意到的那样,您无法控制管道以绕过任何消息处理程序。 在您的AuthenticationHandler中,您必须检查您的PathAndQuery是否包含swagger,只需执行以下操作即可。
base.SendAsync(request, cancellationToken);

发送异步请求不应该等待吗? - Jannick Breunis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接