Как поделиться ключом между Global.asax и страницей в Asp.Net

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

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

Вондипло

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 057
4

Ответы 4

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

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

В global.asax.cs:

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

На странице:

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

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

Не уверен, почему вы не можете использовать сеанс в 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 - подходящее место для хранения этого, и вы захотите провести некоторое тестирование производительности, чтобы увидеть, сможет ли он справиться с ожидаемыми вами нагрузками.

Рассматривали ли вы что-то вроде 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");

Это потребует некоторого исследования Castle Windsor и его возможностей IoC, но мне они будут очень полезны для вас.

Другие вопросы по теме