如何在 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");
});
根据需要,网站图标请求现在将失败:
我正在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");
});
根据需要,网站图标请求现在将失败: