如何在ASP.NET 5 Web API中忽略favicon请求

5
我正在练习ASP.NET Core 5中间件。因此,我创建了一个新的Web API项目并删除了除Startup.csProgram.cs之外的所有文件。我还在ConfigureServices方法中删除了所有服务注册,并删除了Configure方法中的所有中间件。
我在Configure方法中添加了一个简单的内联Run中间件,如下所示。
app.Run(async (context) =>
{
    await context.Response.WriteAsync("Hello from Run Middleware");
});

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

屏幕截图: Network tab screen print

这是项目存储库的链接。

这是浏览器默认会发出 favicon 请求吗?或者存在忽略 favicon 请求的选项吗?如果要忽略它,浏览器将会进行调用并且我们需要在代码中忽略该请求吗?还是我们可以直接阻止favicon请求本身?


你可以查看这个帖子,似乎我们无法阻止这种情况:链接 - Jerry Cai
尝试在<head>标签中加入以下代码:<link rel="icon" href="data:,"> - Ruslan_K
1个回答

6

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

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

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

HTML中有一种标签可以告诉浏览器去别的地方找,但它并不能保证一定有效。此外,你需要提供完整的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");
});

如所期望的,现在将无法请求到网站图标:

浏览器网络调试器的截图,显示 / 路径状态为 200,而 favicon.ico 的状态为 404


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接