尝试添加自定义DelegatingHandler
时,我遇到了一个非常奇怪的情况。调用SendAsync
。到目前为止,一切都对生活感到满意。
但是,只要我使用IdentityServer3添加身份验证,我的所有DelegatingHandlers
都会被忽略。 1}}未被调用。
SendAsync()
:
DelegatingHandler
public class LogRequestAndResponseHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
// log request body
string requestBody = await request.Content.ReadAsStringAsync();
//Trace.WriteLine(requestBody);
// let other handlers process the request
var result = await base.SendAsync(request, cancellationToken);
// once response body is ready, log it
var responseBody = await result.Content.ReadAsStringAsync();
//Trace.WriteLine(responseBody);
return result;
}
}
startup.cs
public void Configuration(IAppBuilder app)
{
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = Globals.TokenAuthenticationAuthority,
ValidationMode = ValidationMode.ValidationEndpoint,
RequiredScopes = new[] { "scope1", "scope2", "scope3" }
});
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Filters.Add(new AuthorizeAttribute());
app.UseWebApi(config);
}
:
WebApiConfig
在挖掘和玩耍后,我发现破坏的线是
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
config.MessageHandlers.Add(new LogRequestAndResponseHandler());
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
但我不明白为什么。任何帮助将不胜感激。
答案 0 :(得分:0)
来自问题的评论链
在&#39; WebApiConfig.Register()&#39;
之后调用Configuration()
这就是问题所在。 Configuration()
中的Startup.cs
方法会创建一个新的HttpConfiguration
并将其传递给.UseWebApi()
。这有效地撤消了WebApiConfig.Register()
所做的一切,因为它向传入的HttpConfiguration
添加了过滤器,消息处理程序等。
要解决此问题,您有两种选择:
var config = new HttpConfiguration();
中的Startup.cs
更改为var config = GlobalConfiguration.Configuration
Startup.Configuration()
之前致电WebApiConfig.Register()
并确保传递新的HttpConfiguration