首页 > 解决方案 > 如何从 Identity Server 4 端点获取路由数据

问题描述

我有一个 ResponseTimeMiddleware.cs 负责获取每个请求的响应时间指标(我正在使用 datadog)。由控制器和操作名称标记。然而,当我们点击“connect/token”端点时,context.GetRouteData() 为空,可能是因为身份服务器在幕后执行此操作。有没有一种方法可以获得这些信息或其他一些我可以标记的独特信息?

这是我的代码:

public class ResponseTimeMiddleware
{

    // other code..

    public Task InvokeAsync(HttpContext context)
    {
        var request = context.Request;
        var watch = new System.Diagnostics.Stopwatch();
        watch.Start();
        context.Response.OnStarting(() =>
        {
            watch.Stop();

            var routeData = context.GetRouteData();
            var responseTime = watch.ElapsedMilliseconds.ToString();
            var tags = new[] { $"statusCode:{context.Response.StatusCode.ToString()}", $"controller:{routeData.Values["controller"]}", $"action:{routeData.Values["action"]}" };

            context.Response.Headers[ResponseHeaderResponseTime] = responseTime;

            DogStatsd.Timer("response.time", responseTime, tags: tags);

            return Task.CompletedTask;
        });

        return nextDelegate(context);
    }
}

这是我的启动:

public class Startup
{

    // other code..

    public static void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseMiddleware<ResponseTimeMiddleware>();
        app.UseMvcWithDefaultRoute();
        app.UseStaticFiles();
        app.UseEndpointRouting();
        app.UseCookiePolicy();
        app.UseCors("CorsPolicy");
        app.UseIdentityServer();

    // This method gets called by the runtime. Use this method to add services to the container.
    public async void ConfigureServices(IServiceCollection services)
    {
        services.AddDataDogStatsd(Configuration, "identity");

        // other code
    }
}

标签: asp.net-coreidentityserver4datadog

解决方案


context.Request.Path如果您的routeData为空,则有条件地使用。这是我能想到的最接近的,因为 Identity Server 4 中间件具有用于标准 OAuth 协议路由的内部路由逻辑。


推荐阅读