我有一个经典的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")%>
答案 0 :(得分:0)
显然(我不知道为什么)访问Form
会导致ASP.NET消费&#34;消费&#34; http请求的正文;并且它不再适用于传统的ASP。
此处可能的解决方法是使用Server.TransferRequest
,特别是使用preserveForm
true。这导致服务器端传输;客户没有注意到。
由于该有效性导致服务器处理传输的请求,就像它是新的一样,并且由于您可能想要转移到同一路径,因此您的IHttpModule
也将执行第二个&#34;虚拟&# 34;请求。
这意味着您需要添加模块可以查找的自定义标头,以便它可以抑制第二个请求的进一步处理。