C# 实现IdentityServer3时未调用Web API 2 DelegateHandler
我在尝试添加自定义C# 实现IdentityServer3时未调用Web API 2 DelegateHandler,c#,identityserver3,.net-4.6,C#,Identityserver3,.net 4.6,我在尝试添加自定义DelegatingHandler时遇到了一个非常奇怪的场景。调用SendAsync。到目前为止,一切都是幸福的生活 但是,只要我使用IdentityServer3添加身份验证,我的所有delegatinghandler都将被忽略发送异步()未被调用 DelegatingHandler: public class LogRequestAndResponseHandler : DelegatingHandler { protected override async Tas
DelegatingHandler
时遇到了一个非常奇怪的场景。调用SendAsync
。到目前为止,一切都是幸福的生活
但是,只要我使用IdentityServer3添加身份验证,我的所有delegatinghandler
都将被忽略<代码>发送异步()未被调用
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;
}
}
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 }
);
}
}
在挖掘和玩耍之后,我发现断裂的线是
config.MapHttpAttributeRoutes();
但我就是不明白为什么。任何帮助都将不胜感激。来自该问题的评论链 在“WebApiConfig.Register()”之后调用Configuration() 这就是问题所在。
Startup.cs
中的Configuration()
方法创建一个新的HttpConfiguration
并将其传递给.UseWebApi()
。这有效地撤消了WebApiConfig.Register()
所做的一切,因为它向传入的HttpConfiguration
中添加了过滤器、消息处理程序等
要解决此问题,您有两个选项:
var config=new HttpConfiguration()代码>在Startup.cs
到var config=GlobalConfiguration.Configuration
WebApiConfig.Register()之前调用Startup.Configuration()
,并确保传入新的HttpConfiguration
从这个问题的评论链上 在“WebApiConfig.Register()”之后调用Configuration() 这就是问题所在。
Startup.cs
中的Configuration()
方法创建一个新的HttpConfiguration
并将其传递给.UseWebApi()
。这有效地撤消了WebApiConfig.Register()
所做的一切,因为它向传入的HttpConfiguration
中添加了过滤器、消息处理程序等
要解决此问题,您有两个选项:
var config=new HttpConfiguration()代码>在Startup.cs
到var config=GlobalConfiguration.Configuration
WebApiConfig.Register()之前调用Startup.Configuration()
,并确保传入新的HttpConfiguration
它通过控制器了吗?另外,您是否在任何地方调用
WebApiConfig.Register
?它确实会通过控制器并正常处理请求。WebApiConfig.Register是在Global.asax.cs@mdickinDoesWebApiConfig.Register()
在Startup.cs
中的Configuration()
之前或之后调用的{AreaRegistration.RegisterAlareas();GlobalConfiguration.Configure(WebApiConfig.Register);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);}这是Global.asax.cs,Startup.cs代码在顶部。@mdickint这没有回答我的问题。如果Configuration()
在WebApiConfig.Register()之后调用
,然后它将覆盖全局HttpConfiguration
。您可以设置断点以查看调用顺序吗?它是否通过控制器?此外,您是否在任何地方调用WebApiConfig.Register
?它确实通过控制器并正常处理请求。在Gl中调用WebApiConfig.Registerobal.asax.cs@mdickinDoesWebApiConfig.Register()
在Startup.cs
中的Configuration()
之前或之后调用?公共类webapicapplication:System.Web.HttpApplication{受保护的无效应用程序\u Start(){AreaRegistration.Registeralareas();GlobalConfiguration.Configure(WebApiConfig.Register);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);}
这是Global.asax.cs,Startup.cs代码在顶部。@mdickint这并不能回答我的问题。如果Configuration()
在WebApiConfig.Register()
之后调用Configuration()
,那么它将覆盖全局HttpConfiguration
。您能插入断点以查看调用顺序吗?
config.MapHttpAttributeRoutes();