操纵HTTP响应

时间:2011-01-05 21:22:06

标签: asp.net url-rewriting httpresponse

我当前的问题与this one密切相关,但更为具体。我们必须为该问题中描述的目标制定设计策略。

我们希望通过ASP.NET网络表单上的重写HTML 来实现这一目标。我的问题是:根据可行性性能影响对遗留应用程序的实施工作的参数,哪种策略最佳。

我必须做什么

基本上是获取Web窗体的HTML输出,解析它,并根据用户定义的规则替换某些URL。在该示例中,我将所有静态内容重写为CDN URL,但它可以轻松扩展到URL重写技术。我发现很多(我的意思是很多)有关网址重写的文章,从将http://myblog.com/2092这样的网址解释为http://myblog.com/Default.aspx?post=2092的角度来看,但我发现没有人告诉我如何巧妙地将旧式URL格式化为更短的格式,直接从HTML内部(因此页面将直接呈现短格式URL)[编辑]而无需深入的代码干预。

策略1

与上述问题的答案中建议的一样,编写一个拦截HTML并重写它的HTTP模块。实际上,我环顾四周,看到我可以设置一个执行HTML过滤的Response.Filter流对象。

  • 优点:我可以在遗留应用程序上注入HTTP模块,通过XML配置重写规则,让最老的CRM /电子商务应用程序加载来自CDN的静态内容,而无需触及其代码
  • 缺点:我怀疑(以及评论here确认我的嫌疑人)必须重新实施Stream的{​​{1}}方法,该方法在一般情况下对部分缓冲区进行操作,可能会导致更换不良。假设首先使用像Write这样的chunk调用Write方法(我假设ttp://mydomain.com/static/ima之前已经写过),然后调用<img src="h(所以猜测最终的URL :-P)并重写将ge.png" />正则表达为http://mydomain.com/static/[^"]*的规则,替换未完成。要解决这个问题,我可以使用MemoryStream或类似的东西来缓冲完整的数据集,然后执行替换,但这可能会导致高负载服务器出现问题

策略2

here描述的方式覆盖http://cdn.com/path/$1的{​​{1}}方法

  • 优点:不会遇到分块问题
  • 缺点:需要为所有页面定义基类。新应用程序可行,不确定是否可以维护传统应用程序。由于无法直接实例化HttpTextWriter,似乎有问题

显然,对于我们必须开发的新的webapps,我会采用策略2,但我非常喜欢使用动态组件,因为当应用程序需要它们时可以轻松插入(如果我们的新应用程序将在没有CDN的情况下安装,则该功能将被关闭)。

简而言之,我的问题是

你如何解决两种策略的缺点(特别是第一次)?当然,你有其他策略来建议实现这个目标吗?

谢谢。

1 个答案:

答案 0 :(得分:4)

也许你可以使用ASP.NET的“自适应控制行为”功能。见Architectural Overview of Adaptive Control Behavior

基本上,您将重新定义新的HtmlTextWriter类,将其关联为默认渲染器,并使用您自己的代码覆盖“A”标记渲染。