ASP.Net MVC: как получить доступ к сеансу из другого проекта в решении? - PullRequest
2 голосов
/ 04 февраля 2010

У меня есть 2 проекта в моем решении.

  1. MVC Веб-приложение
  2. Библиотека классов

    • Веб-приложение MVC ссылается на библиотеку классов.
    • Библиотека классов содержит класс, расширяющий стандартный контроллер ASP.Net.

Я помещаю переменную в сеанс в приложении Global.asax.

protected void Session_Start(object sender, EventArgs args)
{
   HttpContext.Current.Session["DomainName"] = Request.Url.Host;
}

В библиотеке классов я пытаюсь получить значение из HttpContext.Session, но HttpContext.Session продолжает сбрасываться до нуля.

public class MyController : System.Web.Mvc.Controller
{
    public MyController () : base()
    {
        //HttpContext.Session is always null at this point
        ViewData["DomainName"] = HttpContext.Session["DomainName"];
    } 
}

HttpContext. Current .Session, по-видимому, не поддерживается в контроллерах. Есть идеи?

Ответы [ 4 ]

3 голосов
/ 04 февраля 2010

Две проблемы - свойство HttpContext в классе Controller является текущим сеансом. К сожалению, это не доступно в конструкторе контроллера. Очевидно, что поскольку он не передается в конструктор, он должен быть установлен через свойство впоследствии. Вы можете подумать о добавлении свойства для хранения имени домена и ссылки на него из сеанса - таким образом, оно будет доступно для использования при необходимости.

 protected string DomainName
 {
      get { return this.HttpContext.Session["DomainName"] as string; }
 }

Установите его в ViewData в ваших действиях или в OnActionExecuting / OnActionExecuted.

 protected override void OnActionExecuted( ActionExecutedContext context )
 {
      ViewData["DomainName"] = this.HttpContext.Session["DomainName"];
      // or ViewData["DomainName"] = this.DomainName;  // if you used the property
 }
1 голос
/ 04 февраля 2010

Если вы просто пытаетесь добавить ViewData из сеанса, попробуйте сделать это в методе OnActionExecuting. Здесь я обычно добавляю ViewData, который хочу для каждого View.

0 голосов
/ 06 февраля 2017

Когда вы создаете cookie, вы должны написать

Response.AppendCookie("Your cookie name");

И если вы хотите получить это, то что-то вроде этого

if (Request.Cookies["Your cookie name"] != null)
    {
        string value = Request.Cookies["Your cookie name"].Value;
    }

и должен, если есть разные решения тогда

MachineKey

должен быть таким же, что и под

system.web

в web.config и затем напишите

<httpCookies domain=".yourdomainname.com" />
0 голосов
/ 04 февраля 2010

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

Я не уверен, почему вы помещаете это в сессию, так как вы можете прочитать Request.Url.Host непосредственно во время действия.

...