2014-11-28 2 views
2

Это мой Global.asax файл:Переменные, приведенные значения в Global.asax иногда возвращают неправильные значения

private static bool ismobile = false; 
public static bool IsMobile { get { return ismobile; } } 

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 

     if (Request.Cookies["ismobile"] == null || Request.Cookies["ismobile"].Value == "") 
     { 
      string u = Request.ServerVariables["HTTP_USER_AGENT"]; 
      Regex b = new Regex(@"(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino", RegexOptions.IgnoreCase); 
      Regex v = new Regex(@"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(|\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(|\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg(g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v)|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|)|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase); 
      if (b.IsMatch(u) || v.IsMatch(u.Substring(0, 4))) ismobile = true; else ismobile = false; 
      Response.Cookies["ismobile"].Value = ismobile ? "1" : "0"; 
     } 
     else 
     { 
      ismobile = Request.Cookies["ismobile"].Value == "1" ? true : false; 
     } 

    } 

В моих страницах я использую:

bool ismobile = ASP.global_asax.IsMobile; 

Если я обновить страницу несколько раз, около 20% времени ismobile имеет неправильное значение. Такая же система, тот же код. Что может быть неправильным?

ответ

6

В приложениях ASP.NET вы никогда не должны использовать static, так как переменные static используются во всех сеансах. Скорее всего, значение перезаписывается другим сеансом.

Изменить, чтобы она стала Session переменной, которая, как это имя говорит, доступно только для текущей сессии:

public bool? IsMobile 
{ 
    get 
    { 
     return HttpContext.Current.Session["ismobile"] as bool?; 
    } 
    set 
    { 
     HttpContext.Current.Session["ismobile"] = value; 
    } 
} 
+1

Большое спасибо. Я сам не хотел использовать статическую переменную, но если переменные не были статичными, я не мог получить к ним доступ с других страниц. Я не знаю, почему я не думал об использовании сеанса. еще раз спасибо –

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