Как автоматически вызвать метод, когда сессия ["что-то"] генерирует исключение NullReferenceException? - PullRequest
1 голос
/ 25 декабря 2011

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 25 декабря 2011

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

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

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

Class.GetFirmaid()
4 голосов
/ 25 декабря 2011

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

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

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 голосов
/ 25 декабря 2011

Вы можете создать фильтр действий, который будет гарантировать, что Session ["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"]когда действие выполняется.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...