如何从Identity Server 4端点获取路由数据

时间:2019-05-13 17:02:43

标签: asp.net-core identityserver4 datadog

我有一个ResponseTimeMiddleware.cs,负责为每个请求获取响应时间指标(我正在使用datadog)。由控制器和动作名称标记。但是,当我们命中“ connect / token”端点时,context.GetRouteData()为null,这可能是因为身份服务器正在幕后进行。有什么办法可以获取此信息或其他可以标记的独特信息?

这是我的代码:

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
    }
}

1 个答案:

答案 0 :(得分:1)

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