web-dev-qa-db-ja.com

静的メソッド内でセッション変数の値を取得するにはどうすればよいですか?

JQueryでASP.NETページメソッドを使用しています... C#の静的メソッド内でセッション変数の値を取得するにはどうすればよいですか?

protected void Page_Load(object sender, EventArgs e)
{
    Session["UserName"] = "Pandiya";
}

[WebMethod]
public static string GetName()
{
    string s = Session["UserName"].ToString();
    return s;
}

これをコンパイルすると、エラーが発生します。

オブジェクト参照は、非静的フィールド、メソッド、またはプロパティ 'System.Web.UI.Page.Session.get'`に必要です

57
ACP

HttpContext.Current.Session["..."]

HttpContext.Currentは、現在の...を取得します。HttpContext;アクセスできる場所:セッション、リクエスト、レスポンスなど

98
jwwishart

スレッドを変更していない場合は、jwwishartで示されているように、HttpContext.Current.Sessionを使用できます。

HttpContext.Currentは、スレッドに関連付けられたコンテキストを返します。これは、たとえば、新しいスレッドを開始した場合は使用できないことを意味します。 mayスレッドの敏ility性も考慮する必要があります。ASP.NETリクエストは、リクエスト全体で常に同じスレッドで実行されるとは限りません。 I believeコンテキストは適切に伝播されますが、覚えておく必要があることです。

20
Jon Skeet

これを試して:

HttpContext.Current.Session["UserName"].ToString();
2
Muhammad Awais

HttpContext.Current を介して現在のSessionにアクセスできます-HttpContextを取得できるstaticプロパティ現在のWeb要求に適用されるインスタンス。これは、静的アプリコードおよび静的ページメソッドの一般的なパターンです。

string s = (string)HttpContext.Current.Session["UserName"];

[WebMethod(EnableSession = true)]で装飾されたASMX Webメソッド内からSessionにアクセスするには、同じ手法が使用されます。そのようなメソッドは静的ではないが、Pageから継承せず、したがって直接アクセスできないためですSessionプロパティに。

静的コードは、同じ方法で Application Cache にアクセスできます。

string var1 = (string)HttpContext.Current.Cache["Var1"];

静的コードが別のプロジェクト内にある場合、System.Web.dllを参照する必要があります。ただし、この場合、コードがASP.NETコンテキストの外部から呼び出された場合、HttpContext.Currentnullになるため、このような依存関係を避けるのが最善です一般理由。代わりに、引数としてHttpSessionStateを要求できます(もちろんSystem.Webへの参照が必要です):

public static class SomeLibraryClass
{
    public static string SomeLibraryFunction(HttpSessionState session)
    {
       ...
    }
}

コール:

[WebMethod]
public static string GetName()
{
    return SomeLibraryClass.SomeLibraryFunction(HttpContext.Current.Session);
}
1
Stephen Kennedy