2011-01-05 92 views
4

我现在的问题是密切相关的this one,但更为具体。我们必须为这个问题中描述的目标规划一个设计策略。操纵HTTP响应

我们想通过来重写ASP.NET网页表单上的HTML。我的问题是:根据参数的可行性,性能影响在传统应用的实施努力,哪个策略是最好的。

我要做

是基本上得到一个Web窗体的HTML输出,分析它,并根据用户定义的规则替换某些URL。在那个例子中,我会将所有静态内容重写为CDN URL,但它可以很容易地扩展到URL重写技术。我发现很多(我真的是很多)的约URL不必像http://myblog.com/2092网址解释为http://myblog.com/Default.aspx?post=2092的角度改写文章,但我没有发现我展示如何巧妙格式旧式的URL缩短格式正确从HTML内部(所以页面将直接渲染短格式的URL)[编辑]没有深入的代码干预。

策略1

像在上述问题的回答表明,写截取HTML和重写它的HTTP模块。实际上,我环顾四周,看到我可以设置一个执行HTML过滤的流对象Response.Filter

  • 优点:我可以注入上的遗留应用的HTTP模块,经由XML配置重写规则,并且具有从CDN最古老的CRM /电子商务应用负载的静态内容,而完全不触摸它的代码
  • 缺点:我怀疑(和注释here确认本人嫌疑人),其具有重新实现StreamWrite方法,该方法在一般情况下的局部缓冲器工作,可能会导致不良的替代品。假设Write方法首先用ttp://mydomain.com/static/ima(我假定<img src="h已被写入之前)和后面的ge.png" />(因此猜测最终的URL :-P)这样的块用一个重写规则代入http://cdn.com/path/$1的重写规则调用,但替换没有完成。要解决这一点,我可以用一个MemoryStream或类似的东西来缓冲一套完整的数据,然后进行换人,但它可能会导致在高负载的服务器

策略2

重写的烦恼PageRender方法的方式,例如描述here

  • 优点:不会受到分块问题
  • 缺点:需要为所有页面定义基类。在新的应用程序上可行,不保证传统的应用程序。似乎已经因为你不能实例化一个问题HttpTextWriter直接

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

简单地说,我的问题是

你如何解决这两个战略缺点(尤其是第一次)?当然,您是否有其他策略可以实现这一目标?

谢谢。

+0

你想在服务器端或客户端做到这一点? – Davidann 2011-01-05 21:27:07

+0

如果您也有客户策略,欢迎您。它可以节省一些服务器的计算工作量。我问了一个服务器策略,但我的问题中有99%是** **,所以任何建议都是值得欢迎的!我对客户端策略的怀疑(我猜这是一个Javascript,它通过DOM/JQuery/XPath解析HTML)是我*应该*确保IMG URL在浏览器尝试加载它们以获得最佳性能之前被重写。无论如何,我很好奇你的策略! – 2011-01-05 21:31:44

回答

4

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

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

+0

看着那个......绝对棒!我也可以覆盖链接和img标签以获得CDN重写。这种方法似乎既可插入,因为它只需要主应用程序中的.browser文件,而不需要CPU,因为重写是在飞行中完成的!我开始了几个实验...... :) – 2011-01-05 22:31:54

+0

我对这种技术很感兴趣。任何人都可以指导我看一个代码示例吗?我特别感兴趣的是重写图片网址以使用不同的(CDN)子域名。 – 2011-06-03 16:54:58