3

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

无论它们来自哪个世界,我都需要通过一些 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

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

4

4 回答 4

4

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

于 2013-08-06T10:47:45.060 回答
1

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

于 2015-10-08T17:25:51.493 回答
1

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

于 2019-04-18T15:43:00.107 回答
-1

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

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

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

希望这可以节省我今天花费的时间...

于 2015-10-03T02:54:48.973 回答