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