我们有一个负责文件下载的自定义 IHttpHandler。处理程序映射到 URL /downloadfile.rem
浏览器将用户重定向到格式如下的 URL:
/downloadfile.rem/[fileID]/[mimeType]/[fileName].[extension]
示例:
/downloadfile.rem/54923876129874545456621/text$plain/data.txt
我们的处理程序从 URL 获取提供的信息并使用文件数据进行响应。
此方法在 IIS 6 和 IIS 7 中有效,但我们遇到了 ASP.NET 开发服务器的问题。看来,IIS 6 和 IIS 7 从左到右查看 URL 并停止和“downloadfile.rem”部分并正确调用我们的自定义处理程序。ASP.NET 开发服务器似乎从右到左查看 URL,并根据 URL 末尾的扩展名决定如何处理文件。这给出了 404 响应。当我们从 URL 的末尾删除扩展名时,一切都按预期工作。
这是我们在 httpHandlers 部分的条目:
<add verb="GET" path="downloadfile.rem" type="OurNamespace.DownloadFileHandler"/>
这是我们在处理程序部分的条目:
<add name="DownloadFile" verb="GET" path="downloadfile.rem" type="OurNamespace.DownloadFileHandler"/>
如何使其在 ASP.NET 开发服务器中正常工作?
基本原理 - 为什么我们这样做?
下载文件是 Ajax 请求的结果动态生成的。由于是Ajax请求,我们不能直接将文件返回给浏览器,而是存储在磁盘上供浏览器稍后请求。服务器端的文件名是文件内容的 SHA-1(不带扩展名)。 我们可以简单地让浏览器向/downloadfile.rem?fileID=37452834576542345676234?mimeType=text$plain?fileName=data.csv之
类的 URL 发送 GET 请求, 然后在服务器端返回带有“附件;文件名”的 Content-Disposition 标头=...”,但是在某个版本的 IE 6(我们必须支持)中存在一个错误,它忽略了标题的文件名部分,并且将要求用户保存一个 downloadfile.rem 文件。
因此,我们的 URL 必须以应该提供给文件的文件名结尾。