【问题标题】:Classic ASP Request.Form not working when using integrated pipeline使用集成管道时,经典 ASP Request.Form 不起作用
【发布时间】:2013-07-28 00:08:00
【问题描述】:

我有一个大公司。当前使用 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 代码对其进行修改?

感谢您的帮助, 湿漉漉的

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

【问题讨论】:

  • 只使用Request("formElement") 有效吗?
  • 另外,您可以发布 URL(或至少是主机名)的样子吗?而且 - 任何浏览器都会发生这种情况吗?
  • 嗨,Request("formElement") 也失败了,老实说,它的所有代码都是这样编写的。
  • URL 不是问题,因为我检查了wireshark 以及它以url 编码形式正确传输到服务器的内容。如果我从 post 更改表单标签以使其正常工作,但我不能使用这种方式,因为有时我无法在 url 中显示敏感信息。
  • 很遗憾,我们从未找到解决此问题的方法。与此同时,我们使用许多现代解决方案从头开始完全重建了网站(耶!)。谢谢大家的帮助!

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 您好,劳尔,感谢您的回复。我认为您找到了问题的“原因”。不幸的是,正如几年前所说,我们从未找到解决方案,并且网站从那时起完全重建。 :-) 无论如何,为了记录,我最近在一个旧的 Intranet 网站上再次遇到了类似的问题。再一次,将经典的 asp 和 .net 与多个 webapps 混合在一起。我用不同的方法解决了:我做了一个 c++ NativeModule(注意:不是 clr);可能在 IIS7 的核心中更深入地影响数据,它就像一个魅力一样工作。我建议任何陷入类似问题的人使用 NativeModule
      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        相关资源
        最近更新 更多