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

时间:2016-03-01 10:42:20

标签: c# owin nancy

我正在尝试记录在应用程序管道中向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 app builder的组件。

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

Documentation说它应该是(管道的一部分)。所以我不明白为什么我不能接受它。我甚至尝试使用AddItemToStartOfPipeline

直接插入管道挂钩

1 个答案:

答案 0 :(得分:1)

静态文件处理程序不再是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在处理请求时不会通过。