4

我很难在 ASP.NET Core Web API 中捕获用于记录目的的 HTTP 请求。我在这里找到了一个例子

http://dotnetliberty.com/index.php/2016/01/07/logging-asp-net-5-requests-using-middleware/

这有帮助。它基本上是一个使用中间件功能添加到 HTTP 请求管道的日志记录类。问题是类方法只在应用程序启动时被调用。我无法在我的任何 get 或 post http 请求上调用它。get 或 post http 请求正在工作,因为我可以调试并且响应正常,我尝试在控制台应用程序中使用 Fiddler 和 http 客户端。

这是我的日志记录类

using Microsoft.AspNetCore.Http; 
using Microsoft.Extensions.Logging; 
using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Threading.Tasks; 


namespace CoreWebAPI.Models 
{ 
public class RequestLoggingMiddleware 
{ 
    private readonly RequestDelegate _next; 
    private readonly ILogger<RequestLoggingMiddleware> _logger; 


    public RequestLoggingMiddleware(RequestDelegate next, ILogger<RequestLoggingMiddleware> logger) 
    { 
        _next = next; 
        _logger = logger; 
    } 


    public async Task Invoke(HttpContext context) 
    { 
        var startTime = DateTime.UtcNow; 


        var watch = Stopwatch.StartNew(); 
        await _next.Invoke(context); 
        watch.Stop(); 


        var logTemplate = @" 
Client IP: {clientIP} 
Request path: {requestPath} 
Request content type: {requestContentType} 
Request content length: {requestContentLength} 
Start time: {startTime} 
Duration: {duration}"; 


        _logger.LogInformation(logTemplate, 
            context.Connection.RemoteIpAddress.ToString(), 
            context.Request.Path, 
            context.Request.ContentType, 
            context.Request.ContentLength, 
            startTime, 
            watch.ElapsedMilliseconds); 
    } 
} 
} 

这是我的 Startup.cs 类中的 Startup.Configure 方法

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
        loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
        loggerFactory.AddDebug(); 




        app.UseApplicationInsightsRequestTelemetry(); 


        app.UseApplicationInsightsExceptionTelemetry(); 


        app.UseMvc(); 
        app.UseCors(builder => builder.AllowAnyOrigin()); 


        app.UseMiddleware<RequestLoggingMiddleware>(); 

    }

最后一行是我使用 app.UseMiddleware 捎带回 HTTP 请求的地方。我认为这应该可行,但是如果有人知道为什么它不可行或替代方案会很棒。请让我知道您是否应该提供其他信息。

4

2 回答 2

5

中间件以管道的形式被调用,按照它们注册的顺序,它们都决定是否应该调用下一个(参见你自己的日志中间件:)await _next.Invoke(context);

当一个由 Mvc 框架处理的请求进来时,它不会被传递给下一个中间件。

要获取所有请求的日志记录,您需要将日志记录的注册放在任何终止管道的中间件之前,例如 Mvc。

于 2016-08-25T11:50:51.660 回答
3

这将工作得很好。

public async Task Invoke(HttpContext context)
{
    var timer = new Stopwatch();
    timer.Start();
    await _next(context);

    //Need to stop the timer after the pipeline finish
    timer.Stop();
    _logger.LogDebug("The request took '{0}' ms", timerer.ElapsedMilliseconds);
}

在 Startup 中,您需要在管道的开头添加中间件

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug(); 

    app.UseMiddleware<RequestLoggingMiddleware>();

    // rest of the middlewares 
      ..................

    app.UseMvc(); 
}
于 2017-01-30T19:02:30.643 回答