我需要通过一些html修改来修改所有页面输出,无论它们来自哪个世界。 asp部分它真的很老,结构很糟糕,因此我不能采取任何形式的“一般包含”来应用我们需要的所有变化。最后一些asp页面输出来自多个OCX / COM对象的代码...... 我们已经计划完全重写/迁移到.net,但不幸的是,这是一个长期项目,我不能快速进行。
所以我正在考虑(并测试)将其迁移到Win 2008 R2,IIS 7.5并利用集成管道模式,我可以使用.net httpmodule修改所有输出。 一切正常:我可以正确地“注入”HTML代码到通过asp和asp.net呈现的页面,但是当经典的asp页面要处理通过post发送的表单数据时我遇到了问题(x-www-form-urlencoded )模块。
似乎经典的asp在使用集成管道模式时完全缺少Request.Form对象,在每次使用时抛出错误'80004005'; Request.QueryString而不是它正常工作。
我不会切换回经典管道模式,因为我将失去修改由传统ASP呈现的页面的好处。在这里使用Isapi过滤器是一场噩梦,我不会朝这个方向发展。
当Integrated Pipeline模式处于活动状态时,有没有人知道让Request.Form为经典asp工作的任何解决方法 -要么- 在使用经典管道时修改来自经典asp的最终渲染页面输出的任何方法,所以我可以在将它发送到浏览器之前用.net代码修改它吗?
感谢您的帮助, Squiffy
编辑:不幸的是,我们从未找到解决此问题的方法。与此同时,我们使用非常现代化的解决方案从头开始完全重建网站(耶!)。谢谢大家的帮助!答案 0 :(得分:2)
我认为这是因为你在http模块中使用了Request.Form。根据我的实验,Request.Form在集成模式下在asp中工作,除非你在处理asp代码之前从模块访问它。在这种情况下,建议在IIS forums上使用HttpServerUtility.TransferRequest。 你可以使用
const string dontTransferKey = "DONT_TRANSFER_MODULE";
if (HttpContext.Current.Request.Headers[dontTransferKey] != null)
return;
...............all your http module logic. use Request.Form...................
HttpContext.Current.Request.Headers.Add(dontTransferKey, "true");
HttpContext.Current.Server.TransferRequest(HttpContext.Current.Request.Url.AbsolutePath, true);
此解决方案有几个缺点:如果您使用多个http模块,则需要确保它们是幂等的。对于第三方模块,这可能非常困难。
答案 1 :(得分:1)
使用集成模式+模块在Classic ASP中读取Request.Form时出现错误,实际原因是Classic ASP只能处理一次读取/处理二进制POST数据。
这意味着无论如何,第二次读取都会引发错误。
BinaryRead method的文档中提到了该行为:
BinaryRead方法用于读取客户端发送的原始数据 作为POST请求的一部分。此方法用于低级别访问 此数据,例如,使用Request.Form 集合以查看在POST请求中发送的表单数据。你有之后 使用BinaryRead,引用Request.Form中的任何变量 收集导致错误。相反,在您提到 Request.Form集合中的变量,使用BinaryWrite会导致 错误。
我在实践中经常看到它。
在这种情况下,.NET httpmodule可能正在读取POST数据,这将导致Classic ASP Request.Form错误,反之亦然。
答案 2 :(得分:0)
不确定你是否正在使用Glimpse,但如果你是,我只是花了一天时间试图弄清楚为什么我的Classic ASP Request.Forms突然失败了。长话短说:我在下面的一瞥配置中评论了以下几行:
<add type="Glimpse.Core.Policy.AjaxPolicy, Glimpse.Core" />
将其添加回已忽略的类型解决了我的问题。我现在可以在Classic ASP中访问Request.Form / Request(“field”)。顺便说一句,我正在使用集成模式。
希望这能节省一些人今天的时间......
答案 3 :(得分:0)
只是把它放在那里,你试过&#34; Request.Item()&#34;还有吗?