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'`に必要です
HttpContext.Current.Session["..."]
HttpContext.Current
は、現在の...を取得します。HttpContext;アクセスできる場所:セッション、リクエスト、レスポンスなど
スレッドを変更していない場合は、jwwishartで示されているように、HttpContext.Current.Session
を使用できます。
HttpContext.Current
は、スレッドに関連付けられたコンテキストを返します。これは、たとえば、新しいスレッドを開始した場合は使用できないことを意味します。 mayスレッドの敏ility性も考慮する必要があります。ASP.NETリクエストは、リクエスト全体で常に同じスレッドで実行されるとは限りません。 I believeコンテキストは適切に伝播されますが、覚えておく必要があることです。
これを試して:
HttpContext.Current.Session["UserName"].ToString();
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.Current
はnull
になるため、このような依存関係を避けるのが最善です一般理由。代わりに、引数としてHttpSessionState
を要求できます(もちろんSystem.Web
への参照が必要です):
public static class SomeLibraryClass
{
public static string SomeLibraryFunction(HttpSessionState session)
{
...
}
}
コール:
[WebMethod]
public static string GetName()
{
return SomeLibraryClass.SomeLibraryFunction(HttpContext.Current.Session);
}