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@mdickinDoes
    WebApiConfig.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@mdickinDoes
    WebApiConfig.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();