3

更新: 問題は解決しました。読む。

カスタム IHttpModules を追加することが明らかに不可能になった理由は何ですか?

私の質問は関連しています: HttpModule.Init - IIS7 統合モードで HttpApplication.BeginRequest ハンドラーを安全に追加する ただし、この質問はかなり古く、未回答であり、SharePoint コンテキストがありません。HttpModuleを標準の ASP.NET WebForms ページに追加できます。

SharePoint は IIS 8 でホストされています。AppPool は統合モードで実行されます。フレームワーク レベルは 4.0+ です。

namespace My.Namespace
{
    using System;
    using System.Web;

    public class CustomHttpModule : IHttpModule
    {
        private static readonly object mutex = new object();
        private static bool _isInitialized;

        public void Init(HttpApplication context)
        {
            if (!_isInitialized)
            {
                lock (mutex)
                {
                    if (_isInitialized) return;

                    context.BeginRequest += BeginRequest;
                    _isInitialized = true;
                }
            }
        }

        private void BeginRequest(object sender, EventArgs e)
        {   
        }

        public void Dispose()
        {
        }
    }
}

結果:

[NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。] System.Web.PipelineModuleStepContainer.GetEventCount(RequestNotification 通知、Boolean isPostEvent) +30
System.Web.PipelineStepManager.ResumeSteps(例外エラー) +1098
System.Web.HttpApplication. BeginProcessRequestNotification(HttpContext コンテキスト、AsyncCallback cb) +135
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr、HttpContext コンテキスト) +604

web.config は次のようになります。

<system.webServer>
<!-- further elements omitted -->
<modules runAllManagedModulesForAllRequests="true">
  <remove name="AnonymousIdentification" />
  <remove name="FileAuthorization" />
  <remove name="Profile" />
  <remove name="WebDAVModule" />
  <remove name="Session" />
  <add name="SPNativeRequestModule" preCondition="integratedMode" />
  <add name="SPRequestModule" preCondition="integratedMode" type="Microsoft.SharePoint.ApplicationRuntime.SPRequestModule, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  <add name="SharePoint14Module" preCondition="integratedMode" />
  <add name="StateServiceModule" type="Microsoft.Office.Server.Administration.StateModule, Microsoft.Office.Server, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="PublishingHttpModule" type="Microsoft.SharePoint.Publishing.PublishingHttpModule, Microsoft.SharePoint.Publishing, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="DesignHttpModule" preCondition="integratedMode" type="Microsoft.SharePoint.Publishing.Design.DesignHttpModule, Microsoft.SharePoint.Publishing, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="FederatedAuthentication" type="Microsoft.SharePoint.IdentityModel.SPFederationAuthenticationModule, Microsoft.SharePoint.IdentityModel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="SessionAuthentication" type="Microsoft.SharePoint.IdentityModel.SPSessionAuthenticationModule, Microsoft.SharePoint.IdentityModel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="SPWindowsClaimsAuthentication" type="Microsoft.SharePoint.IdentityModel.SPWindowsClaimsAuthenticationHttpModule, Microsoft.SharePoint.IdentityModel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="SPApplicationAuthentication" type="Microsoft.SharePoint.IdentityModel.SPApplicationAuthenticationModule, Microsoft.SharePoint.IdentityModel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  <add name="Session" type="System.Web.SessionState.SessionStateModule" />
  <add name="CustomModule" type="My.Namespace.CustomHttpModule, My.Namespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=066b2229567b6747" />
</modules>
<!-- further elements omitted -->
</system.webServer>

BeginRequest イベントにアタッチしなくなるとすぐに、ページは再び機能します。しかし、明らかに私の http モジュールは役に立たなくなります。

編集 2013.09.19:アプリケーションの起動時に Init() が 2 回呼び出されています。2 回目の呼び出しでのみイベントをアタッチすると、アプリケーションは動作しますが、イベントは発生しません。

編集 2013.09.20: 問題はおそらく解決しました。Init() メソッドが 2 回トリガーされる (その間に Dispose() が呼び出されない) という事実から、実際には IHttpModule の 2 つのインスタンスが共存している可能性があると推測されました。そして、私の以前の観察では、2 番目のインスタンスにイベントがアタッチされている可能性があることが示されていましたが (起動していませんが、アプリケーションへの悪影響もありません)、明らかにその逆ではありません (これは私の static _isInitialized "lock" の場合です)。 .

**したがって、IHttpModule の両方のインスタンスが同じ「構成」を持つ必要があります (イベントハンドラーがアタッチされています)。複数の HttpApplication インスタンスが実行されていることはまったく正常です。これは、ASP.NET (または IIS) が最適化のために内部的に行うことです。それが覚えておくべき重要なことです:)

4

1 に答える 1