Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要帮助识别一个微妙的bug。。在IIS中?会议?在别处_C#_Asp.net_Debugging_Iis_Session - Fatal编程技术网

C# 需要帮助识别一个微妙的bug。。在IIS中?会议?在别处

C# 需要帮助识别一个微妙的bug。。在IIS中?会议?在别处,c#,asp.net,debugging,iis,session,C#,Asp.net,Debugging,Iis,Session,我有一个非常微妙的错误,我很难识别 背景: 我们有两个站点在同一个web服务器上运行相同的应用程序 SiteA——可通过www.SiteA.com访问 SiteB——可通过www.SiteB.com访问 第一次收到请求时,将根据主机标识siteId,并将其存储在会话中,如下所示: protected void Application_BeginRequest(object sender, EventArgs e) { string host = Request.Url.Host;

我有一个非常微妙的错误,我很难识别

背景: 我们有两个站点在同一个web服务器上运行相同的应用程序

  • SiteA——可通过www.SiteA.com访问
  • SiteB——可通过www.SiteB.com访问
第一次收到请求时,将根据主机标识siteId,并将其存储在会话中,如下所示:

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加载之间的差异发生了一些事情,我不知道如何确定这是什么

问题:

有人知道这里会出什么问题吗?某处有些东西弄糊涂了。是不是把请求搞混了?是会话混淆了应该返回站点ID的站点吗

如果需要更多的信息,我会提供的

更新:

作为参考,这是
SessionUser
的定义(基本上,创建对象的静态实例以从会话中获取SiteId值):

公共类会话用户
{
私有静态SessionUser_实例;
public int SiteId{get;set;}
/// 
/// 
/// 
/// 
公共静态SessionUser实例()
{
if(null==\u实例)
{
_instance=new SessionUser();
if(null!=HttpContext.Current.Session)
{
if(null==HttpContext.Current.Session[“用户”])
{
if(HttpContext.Current.Request.QueryString[“sid”]!=null)
{
int nSiteId=int.Parse(HttpContext.Current.Request.QueryString[“sid”]);
_instance.SiteId=nSiteId;
HttpContext.Current.Session[“用户”]=\u实例;
}
}
其他的
{
_instance=(SessionUser)HttpContext.Current.Session[“User”];
}
}
}
返回_实例;
}
}

在不知道“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;
  }
}

在不知道“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;
  }
}

我想您可以将存储当前站点ID的代码放在
块中,但这可能会影响性能。使用两个站点都不共享的东西更有意义,例如

对于锁示例:

if (SessionUser.Instance().SiteId != siteId)
{
    lock(somePrivateStaticObject)
    {
        if (SessionUser.Instance().SiteId != siteId)
        {
            SessionUser.Instance().SiteId = siteId;
        }
    }
}

我想您可以将存储当前站点ID的代码放在
块中,但这可能会影响性能。使用两个站点都不共享的东西更有意义,例如

对于锁示例:

if (SessionUser.Instance().SiteId != siteId)
{
    lock(somePrivateStaticObject)
    {
        if (SessionUser.Instance().SiteId != siteId)
        {
            SessionUser.Instance().SiteId = siteId;
        }
    }
}

嗨,leppie,我已经用定义SessionUser的代码更新了这个问题。@DaveDev:用我的:)替换这个巨大的混乱,并删除那些
静态
字段!我将非常乐意用你的代码替换这些代码——我的同事是一名“yoda程序员”,所以这是他期望的典型结果!但是我有一个问题-你的代码指定了
类SessionUser
应该是
公共类SessionUser
?@DaveDev:我的意思是,只替换
实例()
方法。嗨,我已经用定义SessionUser的代码更新了这个问题。@DaveDev:用我的:)替换这个巨大的混乱,并删除那些
静态
字段!我将非常乐意用你的代码替换这些代码——我的同事是一名“yoda程序员”,所以这是他期望的典型结果!但是我有一个问题-您的代码指定了
类SessionUser
是否应该是
公共类SessionUser
?@DaveDev:我的意思是,只替换
实例()
方法。这很好,但您仍然会在下一次访问中出错。:)@哦,是的,我不知道这段代码是什么时候运行的。我想它需要在Page_Init或其他什么地方才能工作……这一切都很好,但你仍然会在下一次访问中出错。:)@哦,是的,我不知道这段代码是什么时候运行的。我想它需要在Page_Init或其他什么东西中才能工作。。。