如何在Asp.Net中共享Global.asax和Page之间的密钥

时间:2009-01-19 23:16:58

标签: c# asp.net linq-to-sql

我正在使用linq to sql,因此需要存储我的DataContext以供将来用于每个线程(我已经读过这篇文章:http://www.west-wind.com/weblog/posts/246222.aspx 关于实现共享上下文的方法)。我想知道的是,我如何创建一个global.asax文件都知道的单一密钥,如果没有硬编码就会知道网页,如果我对它进行硬编码,密钥必须是针对每个用户的。

非常感谢!

Vondiplo

4 个答案:

答案 0 :(得分:1)

您是否考虑过Castle.Windsor框架中的IContainerAccessor?

然后你可以做类似

的事情
   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; }
     }
   }

通过整个应用程序可以访问Container,例如

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

这需要对Castle Windsor及其IoC功能进行一些研究,但是它们对你非常有用。

答案 1 :(得分:0)

听起来你想看Page.Cache。这是一个在应用程序级别可用的集合。它适用于所有用户的所有会话。

答案 2 :(得分:0)

将DataContext添加到请求范围:

在global.asax.cs中:

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

在页面中:

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

.Items集合的范围限定为单个请求,因此对于给定的键,每个请求都将引用不同的项。

答案 3 :(得分:0)

不确定为什么你不能在Global.asax中使用会话 - 你只需要确保你从正确的地方调用它。

默认情况下,Global.asax中的内容非常少,但是如果需要,可以实现number of methods,并且您可能需要(本地测试)< / EM>:

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是否适合您存储,并且您需要进行一些性能测试,以确定它是否能够处理您期望的各种负载。