2011-12-25 2 views
1

Я буду использовать Session["firmaid"] довольно много в моем приложении. Это значение устанавливается, когда кто-то входит в мою систему.Как автоматически вызывать метод, когда Session ["something"] выбрасывает исключение NullReferenceException?

Если что-то происходит, и это значение теряется из сеанса, я хотел бы каким-то образом получить глобальный метод, который получит его, если он выбрасывает NullReferenceException.

Как я могу это сделать?

В настоящее время мое решение состоит в том, чтобы попытаться поймать каждый раз, когда я использую Session["firmaid"], а затем выполнить метод, который будет помещаться в сеанс, если он выдает Exception.

Есть ли более простой способ сделать это?

ответ

4

Вместо попытки/ловить каждый раз, когда вы можете обернуть доступ к сеансу в строго типизированном классе, а затем получить доступ к сеансу через эту оболочку.

Или даже написать метод расширения:

public static class SessionExtensions 
{ 
    public static string GetFirmaId(this HttpSessionStateBase session) 
    { 
     var firmaid = session["firmaid"] as string; 
     if (string.IsNullOrEmpty(firmaid)) 
     { 
      // TODO: call some method, take respective actions 
     }  
     return firmaid; 
    } 
} 

, а затем в коде вместо:

try 
{ 
    var firmaid = Session["firmaid"]; 
    // TODO: do something with the result 
} 
catch (Exception ex) 
{ 
    // TODO: call some method, take respective actions 
} 

использование:

var firmaid = Session.GetFirmaId(); 
// TODO: do something with the result 
+0

VS can not find HttpSessionBase, и он не знает, что импортировать. Вы имеете в виду HttpSessionStateBase? – Kenci

+0

@ Kenci, вот что я имел в виду: 'HttpSessionStateBase'. –

+0

Вы помещали этот класс в специальное пространство имен? – Kenci

4

Почему бы не просто написать статический обертку вокруг это? Гораздо более надежным и более DRY:

public static int GetFirmaid() { 
    if (HttpContext.Current.Session["firmaid"] == null) { 
    //do something to fall back 
    } 
    return HttpContext.Current.Session["firmaid"] 
} 

Вы, очевидно, придется поставить это в классе вы можете легко получить доступ, а затем вызвать его через:

Class.GetFirmaid() 
0

Вы можете создать действие фильтра, который обеспечит что сессия [ «firmaid»] имеет значение:

public class SetFirmaIdAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     try 
     { 
      var firmaId = Session["firmaid"]; 
     } 
     catch (Exception ex) 
     { 
      // pass filterContext if you need access to Request, Session etc. 
      Session["firmaid"] = SetFirmaId(filterContext); 
     } 
    } 

    private int SetFirmaId(ActionExecutingContext filterContext) 
    { 
     // TODO: implement some logic 
    } 
} 

OnActionExecuting будет вызываться до принятия выполняется, так что вы уже будете иметь Session["firmaid"] набор, когда действие становится казнены.

Как только вы реализуете этот атрибут, вы можете поместить его в действие, контроллер или установить его как глобальный.

Смежные вопросы