使用集成管道时,经典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论坛上使用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模块,则需要确保它们是幂等的。在第三方模块的情况下,这可能非常困难。

刚刚发布,您也尝试过"Request.Item()"吗?

在集成模式+模块的Classic ASP中读取Request.Form时出错的实际原因是Classic ASP只能处理一次读取/处理二进制POST数据。

这意味着无论怎样,第二次读取都会抛出错误。

BinaryRead方法的文档提到了行为:

BinaryRead方法用于读取客户端发送的原始数据作为POST请求的一部分。此方法用于对这些数据,而不是使用Request.Form集合,以查看POST请求中发送的表单数据。在你使用BinaryRead,引用Request.Form中的任何变量集合导致错误。相反,在您参考Request.Form集合中的变量,使用BinaryWrite将导致错误。

我在实践中经常看到它。

在这种情况下,.NET httpmodule可能正在读取POST数据,这会导致Classic ASP Request.Form出错,反之亦然。

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

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

将其重新添加到被忽略的类型中解决了我的问题。我现在可以访问经典ASP中的Request.Form/Request("字段")。顺便说一下,我正在使用集成模式。

希望这能节省我今天花在别人身上的时间。。。

最新更新