3

我正在遭受这个问题,我找不到解释。

拥有一个处理 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;
        }

我正在经历的是预期的行为吗?支持这种行为的文档或理由是什么?

4

0 回答 0