2017-07-14 42 views
2

我已经实现了一个具有swashbuckle/swagger和自定义DelegatingHandler的WebApi项目。 我已经添加了一个SwaggerAccessMessageHandler来检查是否在这种情况下,我不希望我的自定义处理程序运行时发出了一个Swagger请求。WebApi和使用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用/招摇,我得到了一个空白页面,而不是招摇的UI。

更新:好的我现在已经删除了Swagger处理程序。 我添加了一个新的AuthenticationHandler,它在传入的请求查询字符串中检查有效的userKey。我现在无法访问招摇。 有没有办法解决这个问题,所以当我想访问大举的我的自定义处理程序不被调用?

+0

请参阅更新以上。 – wakthar

回答

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管道工程:
enter image description here

正如你可能会注意到,你必须通过管道无法控制绕过任何消息处理程序。 在你的AuthenticationHandler,你必须检查,如果你PathAndQuery包含招摇只是执行以下

base.SendAsync(request, cancellationToken);