我有一个非常微妙的错误,无法识别。
背景:
我们有2个站点在同一Web服务器上运行同一应用程序。
SiteA-由www.SiteA.com访问
SiteB-由www.SiteB.com访问
首次收到请求时,将根据主机识别siteId,并将其存储在Session中,如下所示:
protected void Application_BeginRequest(object sender, EventArgs e)
{
string host = Request.Url.Host;
int siteId = new SiteManager().GetSiteByUrl(host).SiteId;
if (SessionUser.Instance().SiteId != siteId)
{
SessionUser.Instance().SiteId = siteId;
}
}
此ID稍后用于确定要检索的数据并确定要呈现的样式:
// this happens during an initialization phase
_siteConfiguration = _siteManager.GetSiteById(SessionUser.Instance().SiteId);
// then later:
private void SetPageTheme()
{
string theme = null;
switch (_siteConfiguration.SiteId)
{
case ConfigurationHelper.SITE.A:
theme = "SiteATheme";
break;
case ConfigurationHelper.SITE.B:
theme = "SiteBTheme";
break;
}
Page.Theme = theme;
}
问题:
我面临的问题是,如果您几乎完全同时加载两个网站,即在几毫秒内加载,有时SiteA会加载SiteB的主题,反之亦然。这种情况很少发生,但是已经引起了客户的注意,因此现在是一个问题。.在几毫秒内,SiteA加载和SiteB加载之间的差异正在发生,我不知道该怎么做。确定那是什么。
问题:
有谁知道这里可能出什么问题吗?某处变得有些困惑。 IIS是否混淆了请求?是Session混淆了应该返回SiteId的站点吗?
如果需要更多信息,我会提供。
更新:
作为参考,这是
SessionUser
的定义(基本上,创建对象的静态实例以从Session中获取SiteId值):public class SessionUser
{
private static SessionUser _instance;
public int SiteId { get; set; }
/// <summary>
///
/// </summary>
/// <returns></returns>
public static SessionUser Instance()
{
if (null == _instance)
{
_instance = new SessionUser();
if (null != HttpContext.Current.Session)
{
if (null == HttpContext.Current.Session["User"])
{
if (HttpContext.Current.Request.QueryString["sid"] != null)
{
int nSiteId = int.Parse(HttpContext.Current.Request.QueryString["sid"]);
_instance.SiteId = nSiteId;
HttpContext.Current.Session["User"] = _instance;
}
}
else
{
_instance = (SessionUser) HttpContext.Current.Session["User"];
}
}
}
return _instance;
}
}
最佳答案
不知道'SessionUser'类是什么样子,我只能推测。
我将假设SessionUser.Instance()返回一个“静态”实例(或成员)。
现在,这些将在整个应用程序中共享。因此,这不能在两个站点之间共享是有道理的。
我建议您宁可使用HttpContext
将设置存储在BeginRequest
处。
然后,代码将如下所示:
class SessionUser
{
public static SessionUser Instance()
{
var ctx = HttpContext.Current;
var su = ctx["SessionUser"] as SessionUser;
if (su == null)
{
ctx["SessionUser"] = su = new SessionUser();
}
return su;
}
}