C #에서 세션 변수가 null인지 비어 있는지 확인하는 가장 좋은 방법은 무엇입니까?


79

ASP.NET C #에서 세션 변수의 존재를 확인하는 가장 좋은 방법은 무엇입니까?

나는 String.IsNullOrEmpty()문자열에 작품 을 사용하는 것을 좋아하고 Session. 현재 내가 아는 유일한 방법은 다음과 같습니다.

 var session;
 if (Session["variable"] != null)
 {
     session = Session["variable"].ToString();
 }
 else
 {
     session = "set this";
     Session["variable"] = session;
 }

답변:


114

다른 사람들이 말한 것을 따르십시오. 나는 두 개의 레이어를 갖는 경향이 있습니다.

핵심 계층. 이것은 거의 모든 웹 앱 프로젝트에 추가되는 DLL 내에 있습니다 . 여기에는 세션 상태 게터 / 세터에 대한 지저분한 작업을 수행하는 SessionVars 클래스가 있습니다. 다음과 같은 코드가 포함되어 있습니다.

public class SessionVar
{
    static HttpSessionState Session
    {
        get
        {
            if (HttpContext.Current == null)
                throw new ApplicationException("No Http Context, No Session to Get!");

            return HttpContext.Current.Session;
        }
    }

    public static T Get<T>(string key)
    {
        if (Session[key] == null)
            return default(T);
        else
            return (T)Session[key];
    }

    public static void Set<T>(string key, T value)
    {
        Session[key] = value;
    }
}

모든 유형을 얻기위한 제네릭에 유의하십시오.

그런 다음 특정 유형, 특히 문자열에 대해 Getters / Setters를 추가합니다. 사용자에게 제공되는 변수에 대해 null이 아닌 string.Empty로 작업하는 것을 선호하기 때문입니다.

예 :

public static string GetString(string key)
{
    string s = Get<string>(key);
    return s == null ? string.Empty : s;
}

public static void SetString(string key, string value)
{
    Set<string>(key, value);
}

등등...

그런 다음 래퍼를 만들어이를 추상화하고 응용 프로그램 모델로 가져옵니다. 예를 들어 고객 세부 정보가있는 경우 :

public class CustomerInfo
{
    public string Name
    {
        get
        {
            return SessionVar.GetString("CustomerInfo_Name");
        }
        set
        {
            SessionVar.SetString("CustomerInfo_Name", value);
        }
    }
}

아이디어가 맞습니까? :)

참고 : 수락 된 답변에 댓글을 추가 할 때 생각을했습니다. 상태 서버를 사용할 때 세션에 객체를 저장할 때 항상 객체를 직렬화 할 수 있는지 확인하십시오. 웹 팜에있을 때 제네릭을 사용하여 개체를 저장하고 저장하는 것은 너무나 쉬울 수 있습니다. 저는 직장에서 웹 팜에 배포하므로 코어 계층의 코드에 개체가 직렬화 가능한지 확인하기 위해 검사를 추가했습니다. 세션 게터 및 세터를 캡슐화하는 또 다른 이점입니다.


대단한 접근! 나는 오랫동안 비슷한 것을 사용해 왔지만 제네릭을 통합하지 않았습니다. 이렇게하면 서로 다른 개발자가 유사한 세션 변수를 만들 때 발생하는 많은 문제를 방지 할 수 있습니다.
DOK

"throw new ApplicationException ("No Http Context, No Session to Get! ");"인 경우 예외를 처리하려면 어떻게해야합니까? 실행됩니까?, 자동 구현 속성에 대해 혼란 스럽습니다. 코드의 어느 부분에서 발생하면 예외가 발생할 수 있습니다.
Marztres 2015-06-24

좋은 접근입니다. C # 클래스 라이브러리에서 이것을 구현하는 데 문제가 있습니다. HttpSessionState/에 대한 참조를 확인할 수 없습니다 HttpContext. 적절한 네임 스페이스를 가져 오려면 DLL에 MVC 라이브러리를 설치해야 했습니까?
seebiscuit

18

그것이 당신이하는 방법입니다. 그러나 사용할 수있는 더 짧은 구문이 있습니다.

sSession = (string)Session["variable"] ?? "set this";

이것은 세션 변수가 null이면 sSession을 "set this"로 설정하는 것입니다.


1
당신은 이것을 할 수 없습니다 ... Session [ "variable"]은 Object이고 컴파일러는 sSession이 String이기 때문에 String으로 변환 할 것입니다. Session [ "variable"]이 존재하지 않으면 예외를 던집니다. !
balexandre

당신은 절대적으로 정확합니다. Session이 null이 아닌 경우 문자열을 캐스팅하도록 코드를 업데이트했습니다.
Ely

14

속성으로 감싸는 것이 더 우아하게 만들 수 있습니다.

string MySessionVar
{
   get{
      return Session["MySessionVar"] ?? String.Empty;
   }
   set{
      Session["MySessionVar"] = value;
   }
}

그런 다음 문자열로 처리 할 수 ​​있습니다.

if( String.IsNullOrEmpty( MySessionVar ) )
{
   // do something
}

이것이 제가하는 일이며, 앱에서 세션 변수에 훨씬 쉽게 액세스 할 수 있도록합니다. 나는 데이터에 대한 클래스를 만드는 경향이 있으며 모든 null 검사를 수행하는 정적 속성이 작동합니다.
Rob Cooper

문자열이 아닌 세션에 객체를 저장한다면 어떨까요?
Aaron Palmer

1
내 대답을 참조하십시오. 제네릭을 사용하면 다른 객체를 저장할 때 유형 안전성이 가능합니다.
Rob Cooper

실례합니다. 'Session ( "'부분이 맞습니까? 오류가 발생합니다.
Jesus Zamora

VB에있을 것입니다. :) 대괄호로 변경되었습니다.
Greg Ogle 2014

8

C # 3.0의 'as'표기법은 매우 깨끗합니다. 모든 세션 변수는 nullable 객체이기 때문에 예외가 발생할 염려없이 값을 가져 와서 자신의 유형이 지정된 변수에 넣을 수 있습니다. 대부분의 개체는 이러한 방식으로 처리 할 수 ​​있습니다.

string mySessionVar = Session["mySessionVar"] as string;

내 개념은 세션 변수를 로컬 변수로 가져온 다음 적절하게 처리해야한다는 것입니다. 항상 세션 변수가 null 일 수 있다고 가정하고 nullable이 아닌 유형으로 캐스트하지 마십시오.

nullable 유형이 아닌 변수가 필요한 경우 TryParse를 사용하여 가져올 수 있습니다.

int mySessionInt;
if (!int.TryParse(mySessionVar, out mySessionInt)){
   // handle the case where your session variable did not parse into the expected type 
   // e.g. mySessionInt = 0;
}

2

제 생각에는 명확하고 읽기 쉬운이 작업을 수행하는 가장 쉬운 방법은 다음과 같습니다.

 String sVar = (string)(Session["SessionVariable"] ?? "Default Value");

기본값 (문자열을 문자열로 캐스팅)의 경우에도 기본 문자열 값을 캐스팅하기 때문에 가장 효율적인 방법이 아닐 수 있지만 표준 코딩 방법으로 만들면 모든 데이터 유형에 대해 작동합니다. 쉽게 읽을 수 있습니다.

예를 들어 (완전히 가짜의 예이지만 요점을 보여줍니다) :

 DateTime sDateVar = (datetime)(Session["DateValue"] ?? "2010-01-01");
 Int NextYear = sDateVar.Year + 1;
 String Message = "The Procrastinators Club will open it's doors Jan. 1st, " +
                  (string)(Session["OpeningDate"] ?? NextYear);

나는 Generics 옵션을 좋아하지만 모든 곳에서 이것을 필요로하지 않는 한 과잉처럼 보입니다. 확장 메서드는 Session.StringIfNull ( "SessionVar") 및 Session [ "SessionVar"] = "myval"과 같은 "안전한"가져 오기 옵션을 갖도록 Session 개체를 특별히 확장하도록 수정할 수 있습니다. 이것은 Session [ "SessionVar"]를 통해 변수에 접근하는 단순성을 깨뜨리지 만, 깨끗한 코드이며, 필요한 경우 null 또는 string 인 경우 유효성 검사를 허용합니다.


1

아무것도 / Null을 확인하는 것이이를 수행하는 방법입니다.

객체 유형을 다루는 것은 갈 길이 아닙니다. 엄격한 유형을 선언하고 개체를 올바른 유형으로 캐스팅 해보십시오. (그리고 캐스트 힌트 또는 변환 사용)

 private const string SESSION_VAR = "myString";
 string sSession;
 if (Session[SESSION_VAR] != null)
 {
     sSession = (string)Session[SESSION_VAR];
 }
 else
 {
     sSession = "set this";
     Session[SESSION_VAR] = sSession;
 }

구문 위반에 대해 죄송합니다. 저는 매일 VB'er입니다.


1

일반적으로 세션의 항목에 대해 강력한 형식의 속성을 사용하여 SessionProxy를 만듭니다. 이러한 속성에 액세스하는 코드는 nullity를 확인하고 적절한 유형으로 캐스팅합니다. 이것의 좋은 점은 모든 세션 관련 항목이 한곳에 보관된다는 것입니다. 코드의 다른 부분에서 다른 키를 사용하는 것에 대해 걱정할 필요가 없습니다 (그리고 왜 작동하지 않는지 궁금합니다). 그리고 의존성 주입과 조롱을 통해 단위 테스트로 완벽하게 테스트 할 수 있습니다. DRY 원칙을 따르고 합리적인 기본값을 정의 할 수도 있습니다.

public class SessionProxy
{
    private HttpSessionState session; // use dependency injection for testability
    public SessionProxy( HttpSessionState session )
    {
       this.session = session;  //might need to throw an exception here if session is null
    }

    public DateTime LastUpdate
    {
       get { return this.session["LastUpdate"] != null
                         ? (DateTime)this.session["LastUpdate"] 
                         : DateTime.MinValue; }
       set { this.session["LastUpdate"] = value; }
    }

    public string UserLastName
    {
       get { return (string)this.session["UserLastName"]; }
       set { this.session["UserLastName"] = value; }
    }
}

1

또한 속성에 세션 변수를 래핑하는 것을 좋아합니다. 여기에있는 setter는 사소하지만 get 메서드를 작성하여 종료 지점이 하나뿐입니다. 이를 위해 일반적으로 세션 변수의 값을 반환하기 전에 null을 확인하고 기본값으로 설정합니다. 이 같은:

string Name
{
   get 
   {
       if(Session["Name"] == Null)
           Session["Name"] = "Default value";
       return (string)Session["Name"];
   }
   set { Session["Name"] = value; }
}

}


1

이 메서드는 또한 Session 변수의 개체가 문자열이라고 가정하지 않습니다.

if((Session["MySessionVariable"] ?? "").ToString() != "")
    //More code for the Code God

그래서 기본적으로부터 문자열로 변환하기 전에 빈 문자열로 널 변수를 대체 ToString의 일부 Object클래스


0

문자열이라는 것을 알고 있다면 String.IsEmptyOrNull () 함수를 사용할 수 있습니다.


0

.NET 3.5를 사용하고 있습니까? IsNull 확장 메서드를 만듭니다.

public static bool IsNull(this object input)
{
    input == null ? return true : return false;
}

public void Main()
{
   object x = new object();
   if(x.IsNull)
   {
      //do your thing
   }
}

1
다음과 같이 작성할 수 있습니다. public static bool Is (this object input) {return input == null; }
James Curran

확장 방법에주의해야합니다.
Chris Pietschmann

1
확장 방법에주의해야하는 이유는 무엇입니까?
Michael Kniskern

왜 단순히 x == null 또는 x! = null을 사용하지 않습니까?
Benoit

0

이런 식으로 이러한 키를 사용할 수 있는지 여부를 확인할 수 있습니다.

if (Session.Dictionary.ContainsKey("Sessionkey"))  --> return Bool
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.