我正在编写一个 ASP.NET 应用程序,我希望有一个 IIS 用作普通 Web 文件夹的文件夹,但在发生文件未找到错误时有一个特殊的处理程序。
(“http://example.com/Magic/”映射到“C:\example.com\Magic”。)
客户端请求http://example.com/Magic/1.jpg,但缺少 c:\example.com\1.jpg。不是用 404 响应,而是调用了一些 ASP C#,它自己构建 1.jpg 并将其写入到位。IIS 再次查找,找到 1.jpg,并将其返回给客户端,就好像它一直在那里一样。
后来,另一个客户也要求http://example.com/Magic/1.jpg。由于 IIS 在它期望的位置找到文件,它会将它与 IIS 在提供静态文件时允许的所有缓存和字节范围请求一起返回给客户端。
甚至稍后,另一个客户端请求http://example.com/Magic/2.jpg。调用与之前相同的代码来创建 2.jpg,但代码决定没有这样的文件,因此 IIS 返回 404 错误。
一些笔记...
这样做而不是每次都让 ASPX 提供文件的重点是 IIS 将比 ASPX 页面更好地提供静态文件。IIS 支持 if-modified-since 和 byte-range 请求,这样就不需要加载 ASP.NET 模块。
作为管理员,有了这个即时文件创建,我偶尔可以清除“Magic”文件夹,并且任何再次需要的文件都会在第一次再次被要求时重新创建。
我想如果两个客户端同时请求相同的 URL,则会为同一个文件调用文件创建代码的两个副本。这必须写得很健壮才能预期这种可能性。
回答为什么我想在评论中做这样的事情:
确保文件服务器上已经存在“1.jpg”会很好,除了文件很大且磁盘空间不足。一旦客户使用了这些文件,我想删除它们,但没有信号让客户说“我现在已经完成了”。如果我过早删除该文件,我想在客户端再次请求时重新创建该文件而不生成 404。
使用 ASP.NET 为每个请求生成文件从表面上看是可行的,但 ASP.NET 并不擅长提供静态文件。客户端广泛使用缓存头和请求字节范围,当 IIS 已经完成这项工作时,我必须重新实现所有这些处理。
自定义错误页面... 自定义代码运行后,是否可以让 IIS 再次查看,找到它正在寻找的文件,然后继续,就好像从来没有任何错误一样?