我已经在消息处理程序中实现了所有请求/响应数据包的记录,如下所示:
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);
}
}
我也很难对此进行测试,我们非常感谢任何建议。
答案 0 :(得分:0)
正在记录所有请求,但有些回复不是,是吗?在请求记录块之后尝试异常处理,可能是SendAsync方法在记录响应之前抛出异常
答案 1 :(得分:0)
如果您在OWIN下运行,则可以创建中间件来记录请求和独立于web api的响应。如果Web api应用程序内发生异常,则仍会进行日志记录。斯科特艾伦有一篇关于做到这一点的好文章: