2010-12-13 65 views
2

背景使用前端控制器和IIS服务静态文件的方法?

IIS ISAPI筛选器将所有请求路由到前端控制器Java CMS以进行响应。没有物理文件对应给定的URL。动机:

  1. 网址安全
  2. 强制执行SSL

这是提供静态文件,如音频和视频性能瓶颈。并且,汇集的应用服务器处理线程被占用来响应。

理念

有应用服务器填充一个IIS ISAPI筛选器或HTTP模块,可以读取,然后提供服务的文件来代替。可能使用物理文件路径,内容长度和MIME类型填充响应头。

问题

  1. 糟糕的设计决策没有IIS直接服务于文件?如果是这样,就安全性和SSL强制执行(CMS可以处理这两个方面)的建议。
  2. 如果用IIS有回应,要利用IIS static file caching做些什么?或者缓存有多少好处?

回答

2

我相信你应该允许IIS提供静态文件。您可以让HttpModule(或您的过滤器)将控制权转移回IIS--这意味着安全执行代码可能需要被复制。另一种方法是将应用程序服务器传输控制权交还给IIS来为文件提供服务(安全检查当然会发生在之前)。最后,如您所概述的,您的应用程序服务器可以注入响应标头,然后httpmodule会读取它们并将控制权传递给IIS。不确定关于Java,但在.NET中,您可以使用HttpResponse.TransmitFile方法将控制权交还给IIS - 这应该避免需要制作HttpModule服务文件。

最后,为了进行缓存,您可以始终发出缓存标头,以响应降级(代理或客户端缓存)。如果文件正在改变,那么你可以添加文件依赖等。

编辑:不知道这是否会为你工作。创建一个http处理程序(ashx)并将其标记为IIS中所需的SSL。所有媒体文件将由此处理程序提供。该处理程序将文件作为查询参数。现在,您可以传递一些文件标识符或加密的部分路径(相对于配置的基本路径到文件存储区),以便实际的文件名或路径对用户不可见。您甚至可以制作在一段时间内过期的令牌(基本上,附加文件ID &时间戳并对其进行加密),以便用户不能再使用相同参数请求相同的文件。为处理程序的伪代码将是

void ProcessRequest(HttpContext context) 
{ 
    // read file id/name token 
    var token = context.Request["q"]; 

    // validate/decrypt token etc and get the actual path for file to be served 
    string filePath; 

    // set needed response headers - content-type, content-disposition and cache related 
    ... 

    // ask IIS to serve the file 
    context.Response.TransmitFile(filePath); 
} 
+0

+1有关如何在应用程序服务器和IIS之间来回发送安全信息的任何建议(如果我有后者进行服务)?而且,如果我采用我提出的方法,它看起来像preSendRequestContent和preSendRequestHeaders可能是我想在httpmodule上使用的两种方法?而且,我可以通过IIS可以读取的响应头来发送信息? – orangepips 2010-12-13 11:32:55

+1

在你提出的方法中,你的应用程序服务器将是一个Http处理程序,所以IMO可以在http模块中使用'PostRequestHandlerExecute' - 这意味着App Server已经完成了请求,并且可能添加了头文件来告诉你的模块此请求需要由IIS提供服务。另请参阅我的编辑替代方法。希望这可以帮助! – VinayC 2010-12-13 11:52:09