我正在遭受这个问题,我找不到解释。
拥有一个处理 ASP 和 ASPX 请求的网站。所有请求都通过一个名为 MyModule 的自定义托管模块运行,假设用于“记录目的”。
这是 Web 配置:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="MyModule" type="MySample.MyModule" preCondition="managedHandler" />
</modules>
</system.webServer>
</configuration>
因此,如果通过 AJAX、html 表单或其他任何方式将表单发布到 /action.asp,我可以在 /action.asp 上查看和打印 Request.Form 集合上的数据。
这是/action.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
dim count
count = Request.Form.Count
Response.write("Result: " & count)
Response.End()
%>
但是,如果在我的自定义托管模块中,我只是在表单集合被 ASP 页面处理之前“PEEK”,集合就会消失,它不再可用于 /action.asp 这是 MyModule:
namespace MySample
{
public class MyModule : IHttpModule
{
public MyModule()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
}
void context_BeginRequest(object sender, EventArgs e)
{
/*
* ALL REQUESTS PASS THROUGH THIS POINT BEFORE CONTINUING.
* COUNTING THE ITEMS ON THE FORM WILL CAUSE THE FORM-COLLECTION
* TO BE CLEARED WHEN IT'S HANDLED BY ASP.
*/
int count = HttpContext.Current.Request.Form.Count;
}
public void Dispose()
{
}
}
}
这非常奇怪。如果我“注释”计数行,则表单集合在未经修改的情况下处理到 ASP 页面。我只需要偷看它就可以运行它。
我想通过一些文档找到对此的解释,而不仅仅是预感。
我不能将 runAllManagedModulesForAllRequests 设置为 false,这不是一个选项。
我通过不同的 .NET 方法调用调试了请求,当您在 .NET HttpRequest 对象上查询 Form 对象时,会发生很多事情,
// Form collection
/// Gets a collection of Form variables.
public NameValueCollection Form {
get {
EnsureForm();
if (_flags[needToValidateForm]) {
_flags.Clear(needToValidateForm);
ValidateHttpValueCollection(_form, RequestValidationSource.Form);
}
return _form;
}
}
// Populates the Form property but does not hook up validation.
internal HttpValueCollection EnsureForm() {
if (_form == null) {
_form = new HttpValueCollection();
/// THE FOLLWING METHOD AS A LOT OF SUB-CALLS AS WELL
if (_wr != null)
FillInFormCollection();
_form.MakeReadOnly();
}
return _form;
}
我正在经历的是预期的行为吗?支持这种行为的文档或理由是什么?