C# 需要帮助识别一个微妙的bug。。在IIS中?会议?在别处
我有一个非常微妙的错误,我很难识别 背景: 我们有两个站点在同一个web服务器上运行相同的应用程序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;
- SiteA——可通过www.SiteA.com访问
- SiteB——可通过www.SiteB.com访问
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或其他什么东西中才能工作。。。