我需要获取请求的时间,以便对某些数据库记录和在请求期间创建的其他记录进行版本控制。
我不能使用DateTime.now,因为我希望在整个请求期间访问相同的时间。
我似乎找不到HTTPContext类中的任何有用信息来帮助我。
我需要获取请求的时间,以便对某些数据库记录和在请求期间创建的其他记录进行版本控制。
我不能使用DateTime.now,因为我希望在整个请求期间访问相同的时间。
我似乎找不到HTTPContext类中的任何有用信息来帮助我。
public interface IHttpRequestTimeFeature
{
DateTime RequestTime { get; }
}
public class HttpRequestTimeFeature : IHttpRequestTimeFeature
{
public DateTime RequestTime { get; }
public HttpRequestTimeFeature()
{
RequestTime = DateTime.Now;
}
}
// You don't need a separate class for this
public class RequestTimeMiddleware
{
private readonly RequestDelegate _next;
public RequestTimeMiddleware(RequestDelegate next)
{
_next = next;
}
public Task InvokeAsync(HttpContext context)
{
var httpRequestTimeFeature = new HttpRequestTimeFeature();
context.Features.Set<IHttpRequestTimeFeature>(httpRequestTimeFeature);
// Call the next delegate/middleware in the pipeline
return this._next(context);
}
}
您需要在Startup.Configure
中添加此中间件:
app.UseMiddleware<RequestTimeMiddleware>();
您可以像下面这样访问请求时间:
var httpRequestTimeFeature = HttpContext.Features.Get<IHttpRequestTimeFeature>();
if (httpRequestTimeFeature != null)
{
var requestTime = httpRequestTimeFeature.RequestTime;
}
HttpContext.Items["RequestTime"] = DateTime.Now;
如果我没记错的话,您还可以将其存储在您的作用域服务中(services.AddScoped<YourService>()
),这样它将在整个请求期间有效。
我不知道ASP.NET Core中是否内置了请求时间,但是您也可以在MVC过滤器中设置它,但我认为在更低级别的HTTP请求管道中设置更为有效。
private static long _requestId
中。这应该会给你一个唯一的请求ID。 - KonradHttpContext.TraceIdentifier
似乎是 ASP.NET Core 公开暴露的唯一东西。 - Konrad
DateTime.Now
将其添加到HttpContext.Items
中。 - KonradHttpContext.Features
。 - Konrad