如何忽略 ASP.NET 5 Web API 中的 favicon 调用

fin*_*s10 5 c# asp.net-core asp.net-core-middleware asp.net-core-webapi

我正在 ASP.NET Core 5 中练习中间件。因此,我创建了一个新的 Web API 项目,并删除了除Startup.csProgram.cs之外的所有文件。我还删除了方法中的所有服务注册ConfigureServices并删除了所有中间件Configure

我在方法中添加了一个简单的内联Run中间件,Configure如下所示。

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Hello from Run Middleware");
});
Run Code Online (Sandbox Code Playgroud)

当我运行和调试时,我注意到上面的中间件被调用了两次。后来我发现第二个电话是为了favicon. 当在浏览器中启动 Web API 时,我从网络选项卡中注意到浏览器正在自动发出 favicon 请求,令人困惑的是,即使我的项目中没有 favicon,favicon 请求也会成功。

截屏: 网络选项卡丝网打印

这是项目存储库的链接

浏览器默认会调用 favicon 吗?或者有一个选项可以忽略图标调用?说到忽略,浏览器会调用,我们需要在代码中忽略该请求吗?或者我们可以阻止图标调用本身?

Jan*_*ann 6

大多数浏览器默认在用户访问新网站时请求网站图标。

没有安全的方法来阻止服务器端的这种情况;你可以添加一个

<link rel="icon" href="https://some/random/path">
Run Code Online (Sandbox Code Playgroud)

标签告诉浏览器去别处寻找,但即使这样也不能保证有效。您还需要提供完整的 HTML 文档。

请求成功,因为您没有在app.Run函数中处理这种情况 - 它只是返回“Hello from Run Middleware”,就像任何其他可能的请求路径一样。

请注意,您实际上并不需要关心该请求:只要您向应用程序添加更多逻辑(例如,控制器路由),所有对不存在文件的调用都将自动返回 404。


但是,如果您想明确阻止网站图标请求到达您的app.Run逻辑,您可以添加一个中间件来检测路径并删除请求:

app.Use(async (context, next) =>
{
    if(context.Request.Path.Value == "/favicon.ico")
    {
        // Favicon request, return 404
        context.Response.StatusCode = StatusCodes.Status404NotFound;
        return;
    }
    
    // No favicon, call next middleware
    await next.Invoke();
});

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Hello from Run Middleware");
});
Run Code Online (Sandbox Code Playgroud)

根据需要,网站图标请求现在将失败:

浏览器网络调试器的屏幕截图,显示 / 的状态 200 和 favicon.ico 的状态 404