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

How to ignore favicon call in ASP.NET 5 Web API

我正在ASP.NET Core 5练习中间件。所以我创建了一个新的web API项目并删除了除Startup.cs[=35=之外的所有文件] 和 Program.cs。我也去掉了ConfigureServices中所有的服务注册,去掉了Configure方法中的所有中间件。

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

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

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

截图:

这里是link到project repo

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

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

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

<link rel="icon" href="https://some/random/path">

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

请求成功,因为您没有在 app.Run 函数中处理这种情况 - 它只是 returns“来自 运行 中间件的问候”,至于任何其他可能的请求路径.

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


但是,如果您想明确阻止 favicon 请求到达您的 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");
});

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