一つのアプローチは、あなたのセッションは、あなたのGlobal.asaxファイル内の任意のASHXのために期限が切れているかどうかを確認することです。存在する場合は、jsonセッションの期限切れオブジェクトを返します。クライアント側では、そのオブジェクトが存在するかどうかを確認し、javascript経由でログインページにリダイレクトします。
だからあなたのGlobal.asaxファイルに次のようなものだろう:
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
var url = HttpContext.Current.Request.Url.OriginalString;
var extension = Path.GetExtension(url);
if (extension == ".ashx" && HttpContext.Current.Session.Contents.Count == 0)
{
HttpContext.Current.Response.StatusCode = 440;
HttpContext.Current.Response.TrySkipIisCustomErrors = true;
HttpContext.Current.Response.Write(new JObject(new JProperty("sessionExpired")).ToString());
HttpContext.Current.Response.End();
}
}
を次に、あなたは「のsessionExpired」オブジェクトを探しているあなたのAJAXクエリのすべてのグローバルAjaxのイベントエラーハンドラを作成します:
$(document).ajaxError(function (event, xhr, settings)
{
if (xhr.responseText && $.parseJSON(xhr.responseText).sessionExpired)
{
window.location.replace("loginUrl.aspx");
return;
}
});
このアプローチの良いところは、あなたが唯一の合理的なセッションの有効期限の取り扱いを得るために、コードのこれら二つのスニペットを持たなければならないということです。しかし、このアプローチには欠点があります:
すべてのashxファイルには、少なくともIReadOnlySessionStateまたはIRequiresSessionStateインターフェイスが必要です。それ以外の場合は、セッションがヌルであるとみなされるため、セッションの期限切れ論理がトリガーされます。これを望まない場合は、特定の.ashxファイルを除外する(ashxファイルを含む特定のパスを含むURLを除外するなど)必要があります。
さらに、セッションの使用に関係しないページの特定の部分がある場合は、それらのページも除外する必要があります。
この質問は、あなたが質問する前に見回していないことを示しています。これは、[リンク](http://stackoverflow.com/questions/856553/how-to-get-asp-net-session-value-in-jquery-method)を助けるかもしれない同様の質問です。 – Ahmad
@ Ahmad-San、私はsimiler 1を探しましたが、答えを見つけることができませんでした。 1つの[似たような質問](http://stackoverflow.com/questions/2006084/managing-session-timeouts-in-asp-net-when-using-asp-net-generichandlers)しかし、適切な答えはありませんでした。どのように。あなたが提供したリンクは、jqueryを使ってセッションのバリューをチェックすることです。しかし、私の問題は、セッションが期限切れになり、Ajaxリクエストが発生した場合、ハンドラで期限切れのセッションを確認する必要があります。 – Rifky
@ Ahmad-San、その質問をする前にウェブを検索したので、質問の-1は公正ではない – Rifky