4

イベントの組み合わせが予期しない動作につながるというレガシープロジェクトで奇妙な問題に遭遇しました(とにかく私には予期していませんでした)。問題をローカルで複製することができました。問題を絞り込むためにデバッグします。以下に詳しくまとめました。ありがとう。注: これは完全なテスト用の再現コードです。

開発環境のセットアップ

  • Windows 7 上の IIS 7.0
  • 統合された AppPool .NET 4.5
  • web.config での HttpModule の登録

Httpモジュール

    public class Logger : IHttpModule
    {
        void IHttpModule.Dispose() {}

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(Context_BeginRequest);
        }

        void Context_BeginRequest(object sender, EventArgs e)
        {
            var _application = (HttpApplication)sender;
            // Comment line below (or change to any other collection) while AutoEventWireUp is true - no problems
            foreach (string key in _application.Request.Form.AllKeys) { }
        }
    }

EventTest.aspx

<%@ Page Language="C#" AutoEventWireup="true" Inherits="EventTest.TestPage" Codebehind="EventTest.aspx.cs" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Test</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:Label ID="Label1" runat="server"></asp:Label><br />
        <asp:Button id="Button1" runat="server" Text="Submit" OnClick="Button1_Click"></asp:Button>
    </form>
</body>
</html>

EventTest.aspx.cs

using System;

namespace EventTest
{
    public partial class TestPage : System.Web.UI.Page
    {
        protected void Page_Load(object sender, System.EventArgs e)
        {
            this.Label1.Text += String.Format("Page_Load fired with PostBack {0}<br />", this.IsPostBack.ToString() );
        }

        override protected void OnInit(EventArgs e)
        {
            // Uncomment this and set AutoEventWireUp to False - no problems
            //this.Load += new EventHandler(Page_Load);
            base.OnInit(e);
        }

        protected void Button1_Click(object sender, System.EventArgs e)
        {
            this.Label1.Text += "Button1_Click Fired<br />";
        }
    }
}

何が起こるのですか

  • AutoEventWireUp が True で、HttpModule が Request.Form コレクションにアクセスする場合、イベントは発生しません。

  • HttpModule の Request.Form 行にコメントを付けるか、コレクションを Request.Headers などに切り替えると、すべてのイベントが発生します。

  • AutoEventWireUp が False (および Page_Load が手動で登録されている) の場合、Request.Form アクセスに関係なく、すべてのイベントが発生します。

AutoEventWireUp を使用していないため、プロジェクトで解決する必要がある問題ではありませんが、なぜこれが発生するのかわかりません。誰かがこれに光を当てることができれば; 私は感謝しています。

編集: Context_PostAcquireRequestState からアクセスする場合、これは問題ではありません。Form は RO のコレクションなので気になるところですが、若干の変更があるようです。

4

1 に答える 1