1

我开发了一个 IIS HTTP 模块,它可以动态调整图像大小。它查看传入的 URL 并执行正则表达式以确定 URL 是否与我们要调整大小的图像匹配,并提取请求的图像大小(缩略图、大等)。然后它检查磁盘上此特定图像大小的缓存版本,然后输出该版本,或者如果未找到,则将源图像的大小调整为请求的大小,将其保存到磁盘,然后输出该文件。代码的症结在这里:

        context.Response.WriteFile(file);
        context.Response.End();

但是,这总是会返回 200 的 HTTP 状态代码,并且不会在后续请求中返回 304。相反,我认为最好让我的模块更改其他 HTTP 处理程序将看到文件请求的“虚拟”路径,并且他们可以做自己的事情,例如缓存等。我尝试使用 HttpContext.RewritePath( ) 但这会导致 500 错误,可能是因为以下几点:

我的图像文件夹位于网站根目录之外。我不希望它们位于网络根目录中,因为有人可能会请求源图像。此图像大小调整系统仅允许具有某个最大尺寸的图像。

4

1 回答 1

1

我会尝试以下选项:

  1. 在站点的根目录下创建指向存储图像的文件夹的符号链接(最简单的方法)。
  2. 手动检查If-Modified-Since请求标头并在需要时返回 304。
  3. 如果正则表达式匹配,则仅保留静态内容服务StaticFileHandler并检查重定向到调整 url 大小的 404 错误。

编辑: 好吧,现在我可以成像以下解决方案:

假设在站点文件夹之外的某个地方有一个原始图像文件夹和特定大小的文件夹:/blabla/origin/blabla/50x50//blabla/250x250等。我们可以创建指向这些文件夹的符号链接,以便 IIS 可以将它们作为常规静态内容提供服务。这些页面可以假设始终存在各种尺寸的图像。如果不是这种情况(新图像出现在 中/blabla/origin/foo.jpg)并且请求来自/50x50/foo.jpg站点返回 404 状态代码,我们可以在Page_Error()事件处理程序中截获该代码。在处理程序中,我们可以检查请求是否来自调整大小的图像并重定向到另一个 url(处理程序),该 url 将调整/origin/foo.jpg到文件夹/50x50/250x250立即返回调整大小的内容或重定向回原始 url。

于 2014-08-17T07:48:57.787 回答