Web API 2响应并不总是发送?

时间:2016-02-23 14:00:07

标签: iis-7 asp.net-web-api2 message-handlers

我已经在消息处理程序中实现了所有请求/响应数据包的记录,如下所示:

output: {
    path: path.resolve(__dirname, 'gae/src/static/build'),
    publicPath: "static/build",
    filename: 'besetfree.js'
},

似乎每天都没有记录大约10-20个api响应(数千个)。我们有移动设备调用这些API并认为它们可能会发出请求,然后丢失网络连接,在这种情况下,响应永远不会被发送或记录。

然而,用postman测试,如果我们执行一个日志运行请求,然后点击它中间的取消按钮,我们确实看到一个响应最终被写入日志。它看起来是在后续请求发出时写的。

如果Web API 2.0收到请求,它是否始终发出响应?客户端中止是否重要?客户端是否失去与网络的连接是否重要?

我们正在使用log4net和一个全局异常记录器来捕获任何错误。但是,查看我们“丢失”响应的所有日志,都没有记录异常。这是全球记录器:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    var correlationId = Guid.NewGuid();

    RequestApiLogger.LogHttpRequest(request, correlationId);

    return await base.SendAsync(request, cancellationToken).ContinueWith(
        task =>
        {
            var response = task.Result;
            response.Headers.Add("http-tracking-id", correlationId.ToString("D"));
            ResponseApiLogger.LogHttpResponse(response, correlationId);
            return response;

        }, cancellationToken);
}

以下是处理程序和记录器在启动时的注册方式。

internal class GlobalExceptionLogger : ExceptionLogger
{
    private static readonly ILog Log4Net = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

    public override void Log(ExceptionLoggerContext context)
    {
        Log4Net.Error(
            string.Format("Unhandled exception thrown in {0} for request {1}", context.Request.Method,
                context.Request.RequestUri), context.Exception);
    }
}

我也很难对此进行测试,我们非常感谢任何建议。

2 个答案:

答案 0 :(得分:0)

正在记录所有请求,但有些回复不是,是吗?在请求记录块之后尝试异常处理,可能是SendAsync方法在记录响应之前抛出异常

答案 1 :(得分:0)

如果您在OWIN下运行,则可以创建中间件来记录请求和独立于web api的响应。如果Web api应用程序内发生异常,则仍会进行日志记录。斯科特艾伦有一篇关于做到这一点的好文章:

Simple Logging Middleware (Katana Part 4)