Как разделить ключ между Global.asax и страницей в Asp.Net - PullRequest
1 голос
/ 20 января 2009

Я работаю с linq to sql, и поэтому мне нужно хранить мой DataContext для будущего использования для каждого потока (я читал эту статью: http://www.west -wind.com / weblog / posts / 246222. ASPX относительно способов реализации общего контекста). Однако я хочу знать, как мне создать один ключ, который будет известен как файлу global.asax, так и веб-странице без ее жесткого кодирования, и если я сделаю это жестко, этот ключ должен быть индивидуальным для каждого пользователя.

Большое спасибо!

Vondiplo

Ответы [ 4 ]

1 голос
/ 20 января 2009

Рассматривали ли вы что-то вроде IContainerAccessor из среды Castle.Windsor?

Тогда вы можете сделать что-то вроде

   public class GlobalApplication : System.Web.HttpApplication, IContainerAccessor
   {
     private static readonly WindsorContainer _container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));

     public IWindsorContainer Container
     {
         get { return _container; }
     }
   }

С контейнером становится доступным через все приложение, как

   var accessor = HttpContext.Current.ApplicationInstance as IContainerAccessor;
   var controller = accessor.Container.Resolve<IDataContext>("myDataContext");

Это потребует некоторых исследований Касл Виндзор и его возможностей IoC, но, думаю, они будут вам очень полезны.

0 голосов
/ 20 января 2009

Добавьте DataContext в область запроса:

В global.asax.cs:

HttpContext.Current.Items["HardcodedKey"] = dataContext;

На странице:

DataContext dc = (DataContext) HttpContext.Current.Items["HardcodedKey"];

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

0 голосов
/ 20 января 2009

Не уверен, почему вы не можете использовать сессию в Global.asax - вам просто нужно убедиться, что вы звоните из правильного места.

По умолчанию в Global.asax очень мало, но есть количество методов , которые вы можете реализовать, если хотите, и вам, вероятно, нужно что-то вроде ( проверено локально) :

void Session_Start(object sender, EventArgs e) 
{
    // Code that runs when a new session is started
    // Pick up your session id here, create a new context and away you go?

    var sessionId = Session.SessionID;

    Session.Add("sessionId", sessionId);
}

void Session_End(object sender, EventArgs e) 
{
    // Code that runs when a session ends. 
    // Note: The Session_End event is raised only when the sessionstate mode
    // is set to InProc in the Web.config file. If session mode is set to StateServer 
    // or SQLServer, the event is not raised.

    // Noting comment above, clean up your context if needs be.
}

Тогда на вашем сайте вы можете иметь что-то вроде:

protected void Page_Load(object sender, EventArgs e)
{
    Literal1.Text = Session["sessionId"].ToString();
}

Я не уверен, что Session - подходящее место для вас, чтобы сохранить это, и вы захотите провести некоторое тестирование производительности, чтобы увидеть, будет ли оно обрабатывать ожидаемые нагрузки.

0 голосов
/ 20 января 2009

Ну, звучит так, будто вы хотите посмотреть на Page.Cache. Это коллекция, которая доступна на уровне приложения. Он доступен во всех сеансах для всех пользователей.

...