首页 文章

使用集成管道时,经典 ASP Request.Form 无效

提问于
浏览
3

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

我需要修改所有页面输出的一些 html 修改,无论它们来自哪个世界。 asp 部分它真的很老,结构很糟糕,因此我不能采取任何形式的“一般包含”来应用我们需要的所有变化。最后一些 asp 页面输出来自多个 OCX/COM 对象的代码......我们已经在计划整个 rewrite/migration 到.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 工作的任何解决办法-or-在使用经典管道时修改来自经典 asp 的最终渲染页面输出的任何方法所以我可以在将它发送到浏览器之前用.net 代码修改它?

谢谢你的任何帮助,Squiffy

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

4 回答

  • 3

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

  • 1

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

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

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

    BinaryRead 方法用于读取客户端发送的原始数据,作为 POST 请求的一部分。此方法用于 low-level 访问此数据,而不是使用 Request.Form 集合查看 POST 请求中发送的表单数据。使用 BinaryRead 后,引用 Request.Form 集合中的任何变量都会导致错误。相反,在引用 Request.Form 集合中的变量后,使用 BinaryWrite 将导致错误。

    我在实践中经常看到它。

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

  • 0

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

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

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

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

  • 0

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

相关问题