IHttpModule Mangling经典ASP表单数据

时间:2015-02-10 21:07:08

标签: c# asp-classic ihttpmodule

我有一个经典的ASP页面,我想在一些使用IHTTPModule的日志记录中包含这些内容。

我的问题是,如果我的模块在页面执行之前访问任何表单变量,我的ASP页面会返回错误' 80004005'一旦访问了第一个Request.Form。

如果我将模块挂钩到asp页面处理后发生的事件,则httpApplication.Context.Request.Form集合为空。

示例模块:

using System;
using System.Web;

namespace FormPostTest
{
public class MyModule1 : IHttpModule
{

    public void Dispose()
    {
        //clean-up code here.
    }


    public void Init(HttpApplication context)
    {
        /* 
         With this line (begin request) I get
          error '80004005'
                /index.asp, line 11 as soon as Request.Form is accessed from the ASP page, however the form collection
         is populated.

         */
        context.BeginRequest += context_GetFormParams;

        /*
         * The line causes for form collection to be empty
         * */
        // context.LogRequest += new EventHandler(context_GetFormParams);
    }


    private void context_GetFormParams(object sender, EventArgs e)
    {
        HttpApplication httpApplication = (HttpApplication) sender;
        Console.WriteLine(httpApplication.Context.Request.Form.Get("MyFormParam"));
    }


}

}

这是我的经典ASP页面。

<html>
<head></head>
<body>
    <form method="post" action="index.asp">
        <input name="MyFormParam" value="Hello" />
        <input type="submit" />
    </form>
</body>
</html>
<%=Request.form("MyFormParam")%>

1 个答案:

答案 0 :(得分:0)

显然(我不知道为什么)访问Form会导致ASP.NET消费&#34;消费&#34; http请求的正文;并且它不再适用于传统的ASP。

此处可能的解决方法是使用Server.TransferRequest,特别是使用preserveForm true。这导致服务器端传输;客户没有注意到。

由于该有效性导致服务器处理传输的请求,就像它是新的一样,并且由于您可能想要转移到同一路径,因此您的IHttpModule也将执行第二个&#34;虚拟&# 34;请求。

这意味着您需要添加模块可以查找的自定义标头,以便它可以抑制第二个请求的进一步处理。