我正在编写一个ASP.NET应用程序,我希望有一个IIS用作普通Web文件夹的文件夹,但在发生file-not-foun错误时有一个特殊的处理程序。
(“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再次查找,找到它正在查找的文件,然后继续,好像从来没有任何错误?