Вопрос по session, asp.net-mvc-3, asp.net – ASP.NET MVC - сессия пуста

9

У меня есть приложение MVC3 на .net4, что его сеанс работает в среде разработки, но не в производстве.
В производственном процессе я зарегистрировал sessionID, и он совпадает с моментом, когда я установил и получил из сеанса.

Когда я пытаюсь получить сессию, я получаюNull Exception.

Вот как я получаю доступ к сессии:

public static class HandlersHttpStorage
{
    public static string TestSession
    {
        get
        {
            return HttpContext.Current.Session["time"];//This is null
        }
        set
        {
            HttpContext.Current.Session.Add("time", value);//DateTime.Now.ToString()
        }
    }
}

Что меня беспокоит, так это то, что поведение в производственном процессе отличается от разработки, хотя web.config такой же.

посмотрите в вашем файле web.config что-нибудь вроде <httpCookies domain = "thing.com "> Adam Tuliper - MSFT
@ AdamTuliper - Можете ли вы объяснить «отдельный домен cookie»? Благодарност Shazam
Завершил поиск моего ответа на этот вопрос здесь: Stackoverflow.com / а / 1212451/578859 Paul
Используйте фидлер и посмотрите на свой идентификатор сессии. Сохраняет ли браузер его (отправляет ли он обратно на сервер при следующем запросе)? Каждый раз отправляется новый клиент? Вы указываете отдельный домен cookie за пределами по умолчанию (это может объяснить работу в одной среде, а не в другой) Adam Tuliper - MSFT

Ваш Ответ

3   ответа
3

что IE не сохраняет куки, если доменное имя имеет подчеркивание (потому что строго говоря доменные имена не могут иметь подчеркивания, поэтому вы, вероятно, столкнетесь с этим только в процессе разработки), например,http://my_dev_server/DoesntWork. Chrome или Firefox должны работать в этом сценарии, и если вы измените имя домена, которое вы используете, чтобы проблема с подчеркиванием не была решена.

Ref:

http: //blog.smartbear.com/software-quality/internet-explorer-eats-cookies-with-underscores-in-the-hostnamehttp: //social.msdn.microsoft.com/Forums/ie/en-US/8e876e9e-b223-4f84-a5d1-1eda2c2bbdf4/ie7-cookie-issue-when-domain-name-has-underscore-character-in -Он? форум = iewebdevelopment
15
Решение 1:

Ссылка HttpContext.Current.Session равен нулю при маршрутизации запросов

Понял. Довольно глупо, на самом деле. Это сработало после того, как я удалил и добавил SessionStateModule следующим образом:

<configuration>
  ...
  <system.webServer>
    ...
    <modules>
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      ...
    </modules>
  </system.webServer>
</configuration>

Просто добавьте, что это не будет работать, так как «Сессия» уже должна быть определена вmachine.config.

Теперь интересно, это обычное дело? Конечно, это не так, потому что кажется таким грубым ...

Решение 2:

Ссылка HttpContext.Current.Session пустой элемент

sessionKey может меняться, вам, вероятно, нужно только сделать:

HttpContext.Current.Session["CurrentUser"]

Если сеанс истекает, проверьте время ожидания:

http: //msdn.microsoft.com/en-us/library/h6bb9cz9 (VS.71) .aspx

Или вы можете устанавливать значение сеанса из другого места, обычно я контролирую доступ к объекту Session / Context через одно свойство

static readonly string SESSION_CurrentUser = "CurrentUser";

public static SiteUser Create() {     
 SiteUser.Current = new SiteUser();      
 return SiteUser.Current;
}

public static SiteUser Current {     
 get {         
  if (HttpContext.Current.Session == null || HttpContext.Current.Session[SESSION_CurrentUser] == null) {             
   throw new SiteUserAutorizationExeption();         
  }          
  return HttpContext.Current.Session[SESSION_CurrentUser] as SiteUser;     
 } 
 set {
  if (!HttpContext.Current.Session == null) {
   HttpContext.Current.Session[SESSION_CurrentUser] = value;
  }
 }
} 
Спасибо, я перепробовал все, что ты здесь предлагаешь, но все равно ничего. Shazam
0

чтоHttpContext.Current был нулевым, поэтому я его создал:

System.Web.HttpContext c = System.Web.HttpContext.Current; 

И я передал это в свою функцию, которая была в моем другом классе, например:

string myString = "Something to save";
SessionExtensions.SetDataToSession<string>(c, "MyKey1", myString);

Я действительно хотел, чтобы моя функция была настоящим методом расширения отSession как показано ниже, но то, что я нашел, былоthis HttpSessionStateBase session был нулевым, это дало быNullReferenceException когда я пытался что-то добавить кSession используй это. Итак, это:

public static class SessionExtensions 
{ 
   /// <summary> 
   /// Get value. 
   /// </summary> 
   /// <typeparam name="T"></typeparam> 
   /// <param name="session"></param> 
   /// <param name="key"></param> 
   /// <returns></returns> 
   public static T GetDataFromSession<T>(this HttpSessionStateBase session, string key) 
   { 
       return (T)session[key]; 
   } 
   /// <summary> 
   /// Set value. 
   /// </summary> 
   /// <typeparam name="T"></typeparam> 
   /// <param name="session"></param> 
   /// <param name="key"></param> 
   /// <param name="value"></param> 
   public static void SetDataToSession<T>(this HttpSessionStateBase session, string key, object value) 
   { 
       session[key] = value; 
   } 
} 

То, что у Microsoft было здесь:https: //code.msdn.microsoft.com/How-to-create-and-access-447ada9место этого @ стало:

public static class SessionExtensions 
{ 
   /// <summary> 
   /// Get value. 
   /// </summary> 
   /// <typeparam name="T"></typeparam> 
   /// <param name="session"></param> 
   /// <param name="key"></param> 
   /// <returns></returns> 
   public static T GetDataFromSession<T>(HttpContext context, string key) 
   { 
        if (context != null && context.Session != null)
        {
            context.Session.Abandon();
        }

        return (T)context.Session[key];
   } 
   /// <summary> 
   /// Set value. 
   /// </summary> 
   /// <typeparam name="T"></typeparam> 
   /// <param name="session"></param> 
   /// <param name="key"></param> 
   /// <param name="value"></param> 
   public static void SetDataToSession<T>(HttpContext context, string key, object value) 
   { 
       context.Session[key] = value; 
   } 
} 

И я смог получить свои данные так:

System.Web.HttpContext c = System.Web.HttpContext.Current;
string myString = SessionExtensions.GetDataFromSession<string>(c, "MyKey1");

И, конечно же, сHttpContext.Current а такжеSession теперь существует, я смог даже упростить это:

 string myString = Session["MyKey1"].ToString();

Если бы это был объект, вы бы поместили тип объекта вместо<string> вSetDataToSession() функция:

List<string> myStringList = new List<string>();
myStringList.Add("Something to save");
SessionExtensions.SetDataToSession<List<string>>(c, "MyKey1", myStringList);

И получить его:

System.Web.HttpContext c = System.Web.HttpContext.Current;
List<string> myStringList = SessionExtensions.GetDataFromSession<List<string>>(c, "MyKey1");

или просто:

List<string> myStringList = (List<string>)Session["MyKey1"];

Похожие вопросы