在Managed HttpModule之后,HttpRequest.Form集合被清除

时间:2015-07-14 19:46:50

标签: asp.net asp-classic iis-7.5 httpmodule integrated-pipeline-mode

我遇到了这个问题我无法找到解释。

拥有一个处理ASP和ASPX请求的网站。 所有请求都通过一个名为MyModule的自定义托管模块运行,假设是为了“记录目的”。

这是WebConfig:

<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,我可以在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;
        }

我遇到的预期行为是什么?备份此行为的文档或原因是什么?

0 个答案:

没有答案