经典的ASP Request.Form在使用集成管道时无法正常工作

时间:2013-07-28 00:08:01

标签: asp.net asp-classic iis-6 iis-7.5 integrated-pipeline-mode

我有一个大公司。混合经典asp和asp.net的网站目前托管了Win 2003服务器,IIS 6。

我需要通过一些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

编辑:不幸的是,我们从未找到解决此问题的方法。与此同时,我们使用非常现代化的解决方案从头开始完全重建网站(耶!)。谢谢大家的帮助!

4 个答案:

答案 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;还有吗?