2016-12-08 8 views
5

System.Web.UI.PageでいくつかのWebMethodを使用していくつかのAjaxリクエストを処理していますが、セッションにオブジェクトを格納しようとしていますいくつかのAjaxリクエストにまたがって情報を保持することができます。共有メソッドのHttpContext.Current.Sessionが変更を永続的に変更しない

私はHttpContext.Current.Session("foo")でセッションにアクセスしています。それがNothingであれば、HttpContext.Current.Session("foo") = New Bar()で設定しました。

私が遭遇している問題は、それが設定された後、次にそのメソッドにヒットしたときにリセットされてしまうことです。他のセッション変数を変更しようとしましたが、セッション変数も元に戻ります。これは、セッション状態のコピーを取得していることを示しています。これは、更新可能で、リクエストからリクエストまで持続できるようにするための参照ではありません。 WebMethodのEnableSessionプロパティがTrueであることを再度確認しましたが、セッション状態の変更は保持されません。

メソッドの宣言:

<System.Web.Services.WebMethod(EnableSession:=True)> 
Public Shared Function foo(ByVal woNum As String, ByVal workCenter as String) As ToolingModel 
    Return ToolingModel.getSessionTooling(woNum, workCenter) 
End Function 

getSessionTooling:

Public Shared Function getSessionTooling(woNum As String, workCenter As String) As ToolingModel 
    Dim tooling As ToolingModel = HttpContext.Current.Session(TOOLING_MODEL_SESSION_KEY) 

    If tooling Is Nothing Then 
     tooling = New ToolingModel(woNum, workCenter) 
     HttpContext.Current.Session(TOOLING_MODEL_SESSION_KEY) = tooling 
    ElseIf tooling.woNum <> woNum OrElse tooling.workCenter <> workCenter Then 
     tooling.woNum = woNum 
     tooling.workCenter = workCenter 
     tooling.assets.Clear() 
    End If 

    Return tooling 
End Function 

私は共有WebMethod属性からアクセスする、永続的なセッション状態に適用する私の変更を取得できますか?

編集:問題が見つかりました。1週間遅れました。 .aspxのの1行目:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="foo.aspx.vb" 
    Inherits="foo" MaintainScrollPositionOnPostback="true" 
    MasterPageFile="~/mstrFoot.master" EnableSessionState="ReadOnly" %> 

ページがPageMethodのEnableSession設定を上書きし、読み取り専用のセッションを、持っているとしました。 [facepalm]

+0

また、関数宣言も投稿できますか?正しい属性を追加するとうまくいくように見えます:http://stackoverflow.com/questions/4758575/how-can-i-access-session-in-a-webmethod '[WebMethod(EnableSession = true)] ' – ps2goat

+0

設定上の問題ではありますか?おそらくPOSTとGETの問題ですか?ユーザーがログインすると、セッション変数が一式設定され、うまく機能しますが、ここでそれらを実行するとセッションに変更を加えることはできません。 –

+0

のどのバージョン。ネットで作業しているので、もっと正確にテストできますか? – ps2goat

答えて

1

IISは、デフォルトでマルチコアCPUを利用します。マルチプロセッサ環境では、web.configのデフォルトのInProc SessionState設定は、異なるスレッド(プロセッサ/コアごとに別々のスレッド)で要求をランダムに処理します。詳細はこちらhttps://msdn.microsoft.com/en-us/library/ms998549.aspx#scalenetchapt06_topic8

FYI、以前はこれもやっていましたが、Web API(SOAP/REST)へのリクエスト間のセッション状態を維持することは、スケールするのが難しいサーバーオーバーヘッドを表しています。複雑なオブジェクトをセッション状態で保存するには、そのオブジェクト/プロパティ/フィールドのすべての側面もシリアライズ可能でなければならず、非常に手間がかかります。それは...

あなたが提供した情報に基づいて、StateServerモードを使用するようにWebアプリケーションを設定し、別のスレッドで処理される複数の要求が維持されるように、一部のマシンでASP.NET状態サービスを有効にする必要がありますCPU間のセッション。 https://msdn.microsoft.com/en-us/library/ms178586.aspx

+0

SessionStateは現在SQLServerモードに設定されていますが、これはStateServerと同じですか? –

+0

セッションがSQLサーバーに永続化されていることが確認されている場合は、これはStateServerと同じ処理を行います。また、カスタムオブジェクト用のカスタムシリアル化を実装する必要があります。 この記事の「out-of-proc」セッションを読んで、カスタムオブジェクトが適切にシリアル化/シリアル化解除されていることを確認してください。http://www.hanselman.com/blog/TroubleshootingExpiredASPNETSessionStateAndYourOptions.aspx –

1

セッションがタイムアウトしていない場合は、ASP.NETがWebメソッド要求と(aspx?)ページ呼び出しの間に別のsessionIDを生成している可能性があります。 2つのWebメソッド呼び出し間で同じセッションを利用できる可能性があります(タイムアウトしていない場合、Cookieを有効にしています)が、ページ呼び出しとWebメソッド間ではありません。

Cannot get session in webmethod in asp.net

+0

セッション変数を出力できますアプリケーションのどこか他の場所に設定されていたセッションの名前(例:ユーザーの名前、電子メールアドレスなど)ですが、WebMethodで変更したものはそのまま残りません。 –

+0

getSessionToolingはどこに定義されていますか?あなたはそのメソッドにhttpcontextを渡していない、それはおそらく要求のための正しいhttpcontextを取得していない可能性があります。コンテキストをメソッド呼び出しに渡してみてください。 – Vivek

+0

私の 'ToolingModel'クラスで定義されています。私はWebMethodからセッションを通過しようとしましたが、私は変更を保持していないセッションで同じ問題がありました。 –

関連する問題