カスタム ASP.NET SessionStateProvider クラスから Session_OnStart イベントを発生させる
-
25-09-2019 - |
質問
私は、社内で開発されたカスタム SessionStateProvider クラスを使用する asp.net プロジェクトに取り組んでいます。
明らかに、Session_OnStart イベントが発生していません。Global.asax にはイベントを処理するコードがあります。このコードを実行するには、デフォルトの SessionStateProvider を使用するように Web.config を変更する必要があります。
カスタム SessionStateProvider クラスを使用しているときに、Session_OnStart コードを実行するにはどうすればよいですか?ソースコードにアクセスできます。
アップデート:MSDN には、通常は次のように明確に記載されています。 Session_OnStart
セッション モードが InProc の場合にのみ起動するため、これを希望どおりに接続するには何か特別な操作を行う必要があります。
web.config でのセッション状態の設定は次のようになります。
< sessionState cookieless="false" regenerateExpiredSessionId="true" mode="Custom"
customProvider="ProgramSessionStateProvider"
sessionIDManagerType="SessionIDManager.ProgramSessionIDManager"
sqlConnectionString="SqlSessionServices" cookieName="smartSessionID" >
< providers >
< add name="ProgramSessionStateProvider"
type="SessionStateProvider.ProgramSessionStateProvider"
connectionStringName="SqlSessionServices" writeExceptionsToEventLog="false" / >
< /providers >
< /sessionState >
再度更新します:今朝、面白いものを見つけました。Chris の回答を読んだ後、customer だけを使用してみました SessionStateProvider
カスタムのコードを削除しました SessionIDManager
. 。それを実行すると、すぐに見ることができました Session_OnStart
メソッドを実行します。問題は私の習慣です SessionStateProvider
必要 カスタム SessionIDManager
. 。正確にはどこにありますか Session_OnStart
イベントが発生した?と関係があるようです SessionIDManager
, ではなく、 SessionStateProvider
.
解決
カスタムSessionStateStoresを扱う第二の答え。コードを見に私は、私が上で何が起こっていたか確認するために私自身の対応が、非機能セッション状態プロバイダを作成しようとしましたので、それがセッション開始を呼び出すことはありませんない理由を参照してくださいすることができませんでした。私のセッション状態プロバイダで、それはGlobal.asaxの罰金にSESSION_STARTと呼ばれます。私はコンセプトのデモ証拠として私のコードが含まれます:
セッション状態プロバイダーます:
namespace WebApplication1
{
public class SessionStateProvider : System.Web.SessionState.SessionStateStoreProviderBase
{
public override SessionStateStoreData CreateNewStoreData(HttpContext context, int timeout)
{
ISessionStateItemCollection foo = new SessionStateItemCollection();
HttpStaticObjectsCollection bar = new HttpStaticObjectsCollection();
return new SessionStateStoreData(foo, bar, 300);
}
public override void CreateUninitializedItem(HttpContext context, string id, int timeout){}
public override void Dispose() { }
public override void EndRequest(HttpContext context) { }
public override SessionStateStoreData GetItem(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions)
{
locked = false;
lockAge = TimeSpan.FromSeconds(10);
lockId = new object();
actions = SessionStateActions.None;
ISessionStateItemCollection foo = new SessionStateItemCollection();
HttpStaticObjectsCollection bar = new HttpStaticObjectsCollection();
return new SessionStateStoreData(foo, bar, 300);
}
public override SessionStateStoreData GetItemExclusive(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions)
{
locked = false;
lockAge = TimeSpan.FromSeconds(10);
lockId = new object();
actions = SessionStateActions.None;
ISessionStateItemCollection foo = new SessionStateItemCollection();
HttpStaticObjectsCollection bar = new HttpStaticObjectsCollection();
return new SessionStateStoreData(foo, bar, 300);
}
internal virtual void Initialize(string name, NameValueCollection config, IPartitionResolver partitionResolver) { }
public override void InitializeRequest(HttpContext context) { }
public override void ReleaseItemExclusive(HttpContext context, string id, object lockId) { }
public override void RemoveItem(HttpContext context, string id, object lockId, SessionStateStoreData item) { }
public override void ResetItemTimeout(HttpContext context, string id) { }
public override void SetAndReleaseItemExclusive(HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem) { }
public override bool SetItemExpireCallback(SessionStateItemExpireCallback expireCallback){return true;}
}
}
のGlobal.asaxます:
protected void Session_Start(object sender, EventArgs e)
{
throw new Exception("It worked!");
}
web.configファイルます:
<sessionState mode="Custom" customProvider="MySessionProvider">
<providers>
<add name="MySessionProvider" type="WebApplication1.SessionStateProvider"/>
</providers>
</sessionState>
この記事のポイントは、あなたも、カスタムプロバイダで、提供されるセッション管理モジュールを使用している場合、それはまだのsession_startイベントをオフに解雇すべきであると言うことは、主です。おそらく、あなたは私のダミー状態プロバイダで試してみて、あなたのイベントをオフに起動かどうかを確認することができます。また、私はあなたとSession_OnStartの署名が実際に正しいと仮定しますか? (すなわちないPARAMATERSまたは(オブジェクト、EventArgs)を)。
我々はこれまで持っているすべての情報が間違っているの線に沿っているので、現在、我々は、ダフの位置にあります。私たちは今、あなたのsessionstateproviderではありませんあなたのコードの残りの部分について、火災や何かににsession_startを引き起こしている程度のいずれかに何かを残しています。私のダミーを使用すると、私たちはその質問(Iの希望を)答える必要があります。
あなたはそれがそのメソッドの後に頭をする場所を見てそこにブレークポイントに入れて試すことができるようにCreateNewStoreData
方法は、お使いのプロバイダクラスで実行された直後に何の価値についてのsession_startイベントがクビにする必要があります。
他のヒント
編集のルックス私はミスが少し疑問上の点行ったように。私はそれはいくつかに興味があるかもしれという理由だけでしかし、ここでこの答えを残すつもりです。あなたはそれがものの、削除されるべきだと思うたら、コメントにお気軽ます。
私は100%でないことを確認私が言っているかのよ以来、は申し訳ありませんが、これは答えですが、それはコメント...
であるには余りにも長くなりました私はあなたがカスタムセッションモジュールを作成したり、セッション状態ストアプロバイダをjsutていた場合ではなかったです。私はモジュールを想定していますが、私はちょうど「SessionStateProvider」から確認されませんでした...
私は、web.configファイルに追加されたHttpModuleをを伝えることができるものから、のGlobal.asaxのイベントにフックアップしようとしているのプロセスを通過します。それがこれを行う方法は、{ことを「{名} _ {イベント}」または「{名前} _on {イベント}」と私はのを考える場所にそれらをアップ配線フォームの方法を探すことであると思われますname}は、あなたのweb.configファイル、そしてもちろんの{イベント}でモジュールを付けた名前であるクラス内のイベントの名前である(すなわち開始)。
だから、本質的に新しいモジュールは、次のように含まれている場合:
<add name="MySession" type="MySessionStateModule" />
あなたはあなたのglobal.asax MySession_Start
私はこのことができます願っています。申し訳ありませんが、それはしていませんし、そのすべてのものは、あなたが前に試してみた場合。私は、コードのビットとあなたが既に試みているもののいくつかのアイデアを与えることをお勧めしたい、それはしかし失敗しました。それは簡単に些細なフォームに削減することができる場合があること(例えば、セッションプロバイダをカスタムコードは、サイト(つまり、web.configファイルの適切な部分)に追加して、あなたのセッションクラスのかもしれないいくつかのコードところも面白いかもしれませんコードですちょうど)短くすると、あなたの誤りを証明できた定数を返します。それが良いでしょう(それは別として、フォームがONSTART呼び出していない動作しないIE)セッション状態を保っているかどうかの、いくつかの兆候。 :)
編集を追加する:の私は私が出会った便利なWebページのいずれかをリンクしようと思いました。標準エラーハンドラは中まで配線されている方法については http://aspnetresources.com/articles/event_handlers_in_global_asax の会談Global.asaxの、私にこれのいくつかが作業するかもしれない方法についての手がかりを与えた興味深い方法HookupEventHandlersForAppplicationAndModulesで私に指摘しています。
私は、運用目的ではなく、具体的とSession_OnStart方法で何かをする必要よりも、セッションを初期化し、たとえば、のような何かを行うことです推測するつもりです。これが事実であると仮定、私はあなたが次のことを行うことができると思います:
1)Appication.PostAcquireRequestStateイベントを処理します。
セッションが初期化されている場合2)ハンドラでは、チェック - 貧乏人の方法は、セッション変数を設定することです - 。その後、適切に行動する