我有一个非常微妙的错误,无法识别。

背景:
我们有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;
  }
}

09-26 18:34