C# 有没有一种方法可以为会话(即,对我的API的一次调用)而不是整个应用程序域设置上下文?(ASP.NET)

C# 有没有一种方法可以为会话(即,对我的API的一次调用)而不是整个应用程序域设置上下文?(ASP.NET),c#,asp.net,.net,C#,Asp.net,.net,我创建了一个大型应用程序,现在遇到了一个问题 我用virdir将客户分开,因此他们总是在不同的应用程序池中。我利用了这一点,在session_start上为db连接字符串和其他上下文内容设置了静态变量,并在整个应用程序中都可以使用它 现在,我不得不创建的virdir数量已经过多(超过500个,而且还在快速增长),我觉得我需要将它们转移到一个(或多个)应用程序池中。问题是我没有在整个应用程序中传递从URL获取的“会话上下文”。更改应用程序以向下传递上下文基本上意味着我需要重写应用程序 有没有一种方

我创建了一个大型应用程序,现在遇到了一个问题

我用virdir将客户分开,因此他们总是在不同的应用程序池中。我利用了这一点,在session_start上为db连接字符串和其他上下文内容设置了静态变量,并在整个应用程序中都可以使用它

现在,我不得不创建的virdir数量已经过多(超过500个,而且还在快速增长),我觉得我需要将它们转移到一个(或多个)应用程序池中。问题是我没有在整个应用程序中传递从URL获取的“会话上下文”。更改应用程序以向下传递上下文基本上意味着我需要重写应用程序

有没有一种方法可以为会话(即,对我的API的一次调用)而不是整个应用程序域设置此上下文?非常感谢你的帮助

上下文示例 -db con str -客户日志文件夹


编辑:我想我可以有一个表,将上下文信息链接到线程id(System.Threading.thread.CurrentThread.ManagedThreadId)?你说的“上下文”是什么意思?您是指请求/响应/会话信息吗?您不需要手动传递它们。在处理http请求的过程中,ASP.Net framework以静态方式公开所有内容:

var ctx = System.Web.HttpContext.Current;
var req = ctx.Request;
var rsp = ctx.Response;
var sess = ctx.Session;
var cache = ctx.Cache;

var myOtherFoos = ctx.Items;
在ASP.Net应用程序中,只要添加了对System.Web程序集的引用,就可以从任何位置访问静态当前上下文


如果您不是指“上下文”,而是指在请求处理过程中需要传递的一些您自己的附加信息,那么HttpContext的项就可以了!它是在每次新请求时创建的一个新集合,您可以将其用作一个轻量级草稿行,在处理单个请求时保存您的物品。与缓存或会话不同,“项”在请求处理结束时蒸发,因此不必担心数据泄漏或与其他请求混合。只要小心你选的钥匙,尽量不要与上面的框架内容冲突:)

你是说customer1对myweb.com/customer1进行身份验证,然后后来发现他们也可以访问myweb.com/customer2,因为两者都在同一个应用程序池中?现在customer1和customer2被隔离在不同的虚拟目录中,因此,无论它们是否在同一个应用程序池中,如果我使用静态变量,它们都包含在该虚拟目录中。我想做的不是使用虚拟目录,而是使用基于域的路由。在这种情况下,customer1和customer2将共享相同的静态变量。我需要这些变量在整个应用程序中对每个客户都是唯一的。如果不重写all方法来传递上下文(据我所知),我无法在整个应用程序中传递上下文。谢谢你的帮助!对我来说,上下文是特定于客户的数据,比如db连接字符串。因此,它是一些任意数据,因此可以将其保存在HttpContext.Current.Session或HttpContext.Current.Items中。第一个将被记住,并在整个用户的http会话中保持不变,因此,一旦将数据放入.session,只要用户仍在登录,它就会一直留在那里(因此,它将可用于该用户的多个页面视图)。如果将其放入.Items中,它将一直保留到当前http请求处理结束(因此,必须为每个页面视图刷新/重写该值)。在代码的任何一点上都可以静态访问。