Nancy 静态文件处理程序不是应用程序管道的一部分

本文关键字:应用程序 管道 一部分 静态 文件 处理 程序 Nancy | 更新日期: 2023-09-27 18:36:47

我正在尝试在应用程序管道中记录向 Nancy 发出的每个请求,但由于某种原因,我似乎无法记录静态文件请求。以下方法均不捕获对静态文件的请求。

ApplicationPipelines.BeforeRequest += ((ctx) => {
    LogTo.Info($"{ctx.Request.UserHostAddress} - {ctx.Request.Method} {ctx.Request.Path}");
    return null;
});
ApplicationPipelines.AfterRequest += ((ctx) => {
    LogTo.Info($"{ctx.Request.UserHostAddress} - {ctx.Request.Method} {ctx.Request.Path} - {ctx.Response.StatusCode}");
});

任何不是静态文件的东西都可以完美地记录下来。

另外,我正在使用位于此处的约定:https://stackoverflow.com/a/21477824/1657476。Nancy 是使用 Nowin 自托管的,并且是添加到 owin 应用程序构建器的唯一组件。

静态文件处理程序不是 Nancy 应用程序管道的一部分吗?如果是这样,如何挂钩到静态文件请求?

文档说它应该是(管道的一部分)。所以我不明白为什么我不能捡起来。我什至尝试过在开始时直接插入管道钩

Nancy 静态文件处理程序不是应用程序管道的一部分

子,AddItemToStartOfPipeline

静态文件处理程序不再是 Nancy 管道的一部分。文档已过时。请参阅问题:https://github.com/NancyFx/Nancy/issues/2328

如果将 Nancy 与 Owin 一起使用,则可以使用中间件来捕获请求和响应(相当于 AfterRequest):

app.Use(new Func<AppFunc, AppFunc>(next => (async context =>
{
    var sendingHeaders = (Action<Action<object>, object>) context["server.OnSendingHeaders"];
    sendingHeaders(state =>
    {
        var ip = context["server.RemoteIpAddress"];
        var port = context["server.RemotePort"];
        var method = context["owin.RequestMethod"];
        var path = context["owin.RequestPath"];
        var status = context["owin.ResponseStatusCode"];
        LogTo.Info($"{ip}:{port} - {method} {path} - {status}");
    }, context);
    await next.Invoke(context);
})));

您需要 OnSendingHeaders 钩子,因为如果 Nancy 处理请求,它不会通过。