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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典的ASP Request.Form在使用集成管道时无法正常工作相关的知识,希望对你有一定的参考价值。

我有一个大公司。混合经典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过滤器是一场噩梦,我不会朝那个方向前进。

有没有人知道在集成管道模式处于活动状态时让Request.Form为经典asp工作的任何解决方法 - 或者 - 在使用经典管道时修改来自经典asp的最终呈现页面输出的任何方式,以便我可以在发送之前使用.net代码修改它它到浏览器?

谢谢你的任何帮助,Squiffy

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

答案

我认为这是因为你在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模块,你需要确保它们是幂等的。对于第三方模块,这可能非常困难。

另一答案

使用集成模式+模块在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出错,反之亦然。

另一答案

不确定你是否正在使用Glimpse,但如果你是,我只是花了一天时间试图弄清楚为什么我的Classic ASP Request.Forms突然失败了。长话短说:我在下面的一瞥配置中注释了以下内容:

  <add type="Glimpse.Core.Policy.AjaxPolicy, Glimpse.Core" />

将其添加回已忽略的类型解决了我的问题。我现在可以在Classic ASP中访问Request.Form / Request(“field”)。顺便说一下,我正在使用集成模式。

希望这能节省一些人今天花的时间......

另一答案

只是把它放在那里,你也试过“Request.Item()”吗?

以上是关于经典的ASP Request.Form在使用集成管道时无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

asp request.form

将经典 ASP 与 ASP.NET 集成

IIS7 集成与经典管道 - 使用更多 ASP.NET 线程?

IIS ASP.NET 何时使用集成模式或经典模式?

为啥此代码给我来自 Request.Form 的无效内容类型? (ASP.NET 核心)

asp中request.form用法