gpt4 book ai didi

c# - IHttpModule 处理经典 ASP 表单数据

转载 作者:太空宇宙 更新时间:2023-11-03 13:11:29 25 4
gpt4 key购买 nike

我有一个经典的 ASP 页面,我想使用 IHTTPModule 将其包装在一些日志记录中。

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

如果我将我的模块挂接到 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")%>

最佳答案

显然(我不知道为什么)访问 Form 会导致 ASP.NET“消耗”http 请求的主体;经典 ASP 不再可以访问它。

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

由于有效导致服务器处理传输的请求,就好像它是新的一样,并且由于您可能想传输到相同的路径,您的 IHttpModule 也将执行这第二个“虚拟”请求。

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

关于c# - IHttpModule 处理经典 ASP 表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28441781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com