Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何从Identity Server 4端点获取路由数据_Asp.net Core_Identityserver4_Datadog - Fatal编程技术网

Asp.net core 如何从Identity Server 4端点获取路由数据

Asp.net core 如何从Identity Server 4端点获取路由数据,asp.net-core,identityserver4,datadog,Asp.net Core,Identityserver4,Datadog,我有一个responseTimeIDdleware.cs负责获取每个请求的响应时间指标(我使用的是datadog)。它由控制器和操作名称标记。但是,当我们点击“connect/token”端点时,context.GetRouteData()为空,可能是因为identity server在幕后进行了此操作。有没有一种方法可以让我获得这些信息或其他一些我可以标记的独特信息 这是我的密码: public class ResponseTimeMiddleware { // other code

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

这是我的密码:

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
    }
}
公共类启动
{
//其他代码。。
公共静态无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(“/Error”);
app.UseHsts();
}
app.UseMiddleware();
app.UseMvcWithDefaultRoute();
app.UseStaticFiles();
app.UseEndpointRouting();
app.UseCookiePolicy();
附录UseCors(“公司政策”);
app.UseIdentityServer();
//此方法由运行时调用。请使用此方法将服务添加到容器中。
公共异步void配置服务(IServiceCollection服务)
{
AddDataDogStatsd(配置,“标识”);
//其他代码
}
}

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

您能找到这个问题的答案吗?我基本上也在尝试做同样的事情。我做到了正如@vidmantas blazevicius所建议的那样,添加一个if-else块:
if(routeData!=null){tags=tags.Concat(新[]{$”控制器:{routeData.Values[“controller”]},$“action:{routeData.Values[“action”]}}.ToArray();}else-if(context.Request.Path.HasValue){tags=tags.Concat(新[]{$”路径:{context.Request.Path}.Path}.ToArray();