在 ASP.NET core 2.1 中获取请求的时间

Chr*_*rds 4 asp.net-core

我需要获取请求的时间来版本一些数据库记录和将在整个请求中创建的其他记录。

我现在不能使用 DateTime,因为我希望在整个请求过程中都可以访问相同的时间。

我似乎无法在 HTTPContext 类中找到任何帮助我的东西。

Kon*_*rad 10

使用 HttpContext.Features 和您的 HTTP 请求管道中间件

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您必须在您的Startup.Configure

app.UseMiddleware<RequestTimeMiddleware>();

您可以访问请求时间,如:

var httpRequestTimeFeature = HttpContext.Features.Get<IHttpRequestTimeFeature>();
if (httpRequestTimeFeature != null)
{
    var requestTime = httpRequestTimeFeature.RequestTime;
}
Run Code Online (Sandbox Code Playgroud)

使用 HttpContext.Items

HttpContext.Items["RequestTime"] = DateTime.Now;

services.AddScoped<YourService>()如果我没记错的话,您也可以将它存储在您的作用域 service( ) 中,这在整个请求中都是有效的。

我不知道 ASP.NET Core 中是否内置了请求时间之类的东西。

您也可以在 MVC 过滤器中设置它,但我认为这在较低级别(HTTP 请求管道)中更有效。