12

次のようなNHibernateセッションを利用してセットアップおよび破棄するBeginRequestアプリケーションがあります。EndRequest

BeginRequest += delegate
{
    CurrentSessionContext.Bind(SessionFactory.OpenSession());
};

EndRequest += delegate
{
    var session = CurrentSessionContext.Unbind(SessionFactory);
    session.Dispose();

    Container.Release(session);
};

「SSLが必要」ボックスをチェックするまで、これはIISに展開すると正常に機能します。これを行うと、NullReferenceExceptionatが得られsession.Dispose()ます。

私はまだこれをデバッグしていません。もちろん、修正は些細なことですが、「SSL が必要」がリクエストのライフサイクルにどのように影響するかについて興味があります。このような場合、サーバー上でセッションが設定されていませんか?

編集: 明確にするために、RequireHttpsコントローラーの属性ではなく、アプリケーションの IIS 構成の「SSL が必要」オプションについて言及しています。

4

2 に答える 2

5

これは私の好奇心を刺激したので、少し掘り下げました。ネクロマンシーでごめんなさい。

アプリケーション オブジェクトのライフサイクル イベントごとに通知を接続し、それぞれにブレークポイントを設定する単純なプロジェクトを作成しました。

「SSLが必要」が設定されていて、SSLなしでアクセスすると、ほとんどのイベントが完全にスキップされることがわかりました。最初に発生するイベントはLogRequestで、その後にPostLogRequestEndRequestPreSendRequestContent、およびPreSendRequestHeaders(この順序で) が続きます。他のイベントは発生しません。

BeginRequestそのため、イベントが発生せず、EndRequestデリゲートが作成されたことのないものを試行したため、コードがクラッシュしDispose()ていました。

私にとって興味深いのは、 IIS がこのように動作する理由を解明することです。その理由は、要求されたリソースが SSL を必要とする場合でも、IIS が無効な接続試行をログに記録し、コンテンツとヘッダーを送信する必要があるためだと思います。結局のところ、何かがフレンドリーな「禁止」ページを生成する必要があります。私が知らないのはEndRequest、わざわざ を呼び出さなかったのに、なぜ が呼び出されるのかということBeginRequestです。それに依存する IIS/ASP クリーンアップ コードがいくつかあると思います。

この動作は、アプリケーション プールが「統合」モードまたは「クラシック」モードのどちらで実行されているかによって異なります。「クラシック」モードでは、ASP.NET イベントはすべて IISPreRequestHandlerExecutePostRequestHandlerExecuteイベントの「間」で発生します。どちらを実行していたかは言いませんでしたが、統合されている必要があります。そうでなければ、期待していた動作が見られたでしょう。つまり、コードはまったく実行されませんでした。

LogRequest興味深いことに、クラシック モードで、PostLogRequest、またはイベントをサブスクライブしようとするとMapRequestHandler、実行時例外が発生します。これらは、統合されたパイプラインのコンテキストでのみ「意味があります」。

于 2011-03-13T21:29:36.820 に答える
-1

ここにあなたを助けるかもしれない何かがあります

IIS 5.0 および 6.0 の ASP.NET アプリケーション ライフ サイクルの概要

IIS 7.0 の ASP.NET アプリケーション ライフ サイクルの概要

代わりに、global.asax で行っていることを実行したい場合があります。

于 2011-02-09T17:28:31.107 に答える