ASP.net 核心静态文件 - 如果请求的文件不存在,如何 return 默认文件(每个扩展名)?

ASP.net Core Static Files - How to return a default file (per extension) if the one requested doesn't exist?

我了解如何根据 this official guide 在 ASP.net 核心 Web 应用程序上设置服务静态文件。如果他们请求的图像(例如)不存在,我不想 return default.html 页面。

Startup.csConfigure(IApplicationBuilder app, IHostingEnvironment env);中,我有app.UseStaticFiles()

我的 Program.cs 文件:

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseDefaultServiceProvider(options =>
                options.ValidateScopes = false)
            .Build();
}

默认情况下,这将允许我在我的应用程序中的 wwwroot 文件夹中存储和提供文件。

如果我在 wwwroot 中有图像文件 mypic.jpg,我可以打开浏览器并转到 http://localhost:53020/mypic.jpg 查看它。

假设我已经部署了这个应用程序并且有人要转到他们的浏览器并转到,或者在他们的网页中,将 imgsrc 设置为 http://mydeployedsite.com/nonexistentpic.jpg ,他们会得到一个 404,或者一个默认页面,这取决于我选择的页面。但是,我想改为提供其图形指示 "file not found" 的图像。我在链接的指南中看不到任何地方,如果请求的文件不存在,我可以选择按扩展名提供默认文件。

我可能不得不为我想要的东西编写中间件。我了解如何编写基本中间件,但在这样的中间件中,我不知道如何拦截来自静态文件中间件的 404 响应。或者,静态文件中间件中可能有更多的选项没有包含在该官方文档中。除了通过路由和控制器功能提供文件外,我还能采取哪些其他方法?

静态文件中间件中没有选项可以满足您的要求。
我想你可以拦截 404 响应,并检查请求是否是图像请求。 这是一个简单的代码

        app.Use(async (context, next) => {
            await next.Invoke();
            //handle response
            //you may also need to check the request path to check whether it requests image
            if(context.Response.StatusCode == 404 && context.Request.Path.Value.Contains(".jpg"))
            {
                context.Response.Redirect("/DefaultImage.gif"); //path in wwwroot for default image
            }
        });
        app.UseStaticFiles();