2010-07-28 2 views
1

나는 식별에 어려움이있는 매우 미묘한 버그가 있습니다.IIS에서 미묘한 버그 식별에 도움이 필요하십니까? 세션? 다른 곳에 ..?

배경 : 동일한 웹 서버에서 동일한 응용 프로그램을 실행하는 2 개의 사이트가 있습니다.

  • 사이트 A - 액세스 www.SiteA.com
  • 사이트 B - 액세스 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; 
    } 
} 

retreive하고 제시 어떤 스타일을 결정하는 어떤 데이터를 결정하는데 이후의 사용이 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; 
} 

0 문제 : 당신이 밀리 초 내에, 즉 정확히 거의 동시에 두 사이트를로드하는 경우

내가 직면하고있어 문제가, 때로는 사이트 A가 사이트 B의 주제와 그 반대의 경우도 마찬가지로로드됩니다 . 이것은 매우 자주 발생하지는 않지만 클라이언트의주의를 끌었습니다. 이제는 문제입니다. SiteA 로딩과 SiteB 로딩의 차이점에서 몇 밀리 초 이내에 어딘가에서 어떤 일이 발생하고 있습니다. 그것이 무엇인지 확인하십시오.

질문 :

사람이 어떤 아이디어가 있습니까 잘못 여기에 무엇을 갈 수 있을까? 뭔가 어딘가에서 혼란스러워지고 있습니다. IIS가 요청을 혼합하고 있습니까? SiteId를 반환 할 예정인 사이트를 혼합하는 세션입니까?

더 많은 정보가 필요한 경우이를 제공합니다.

업데이트 : 참고로

,이 SessionUser의 정의입니다 (기본적으로는, 세션에서 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; 
    } 
} 

답변

4

을 모른 채 'SessionUser'클래스의 모습은 추측 할 수밖에 없습니다.

SessionUser.Instance()는 '정적'인스턴스 (또는 멤버)를 반환한다고 가정합니다.

이제 이러한 정보는 전체 애플리케이션에서 공유됩니다. 따라서 이것이 2 개의 사이트간에 공유 될 수 없다는 것은 의미가 있습니다.

BeginRequest에 설정을 저장하려면 HttpContext을 사용하는 것이 좋습니다.

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; 
    } 
} 
+0

안녕 leppie, 나는 SessionUser를 정의하는 코드로 질문을 업데이 트했습니다. – DaveDev

+0

@DaveDev : 그 거대한 엉망을 광산으로 대체하십시오. :) 그리고 그'정적'필드를 제거하십시오! – leppie

+0

필자는이 코드를 자신의 코드로 대체 할 수있게되어 기쁘게 생각합니다. 제 동료는 'yoda 프로그래머'입니다. 하지만 질문이 있어요 - 귀하의 코드는'class SessionUser'가'public class SessionUser'가되어야한다고 지정하고 있습니까? – DaveDev

0

나는 당신이 lock 블록 내부의 현재 사이트 ID를 저장하는 코드를 넣어 수도 있겠죠,하지만이 성능을 방해 할 수 있습니다

코드는 다음과 같이 표시됩니다. leppie says처럼 두 사이트에서 공유하지 않는 것을 사용하는 것이 더 합리적입니다. 잠금 예를 들어

:

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

그게 전부 좋지만 잘됐지만, 다음 액세스에 여전히 망할 것입니다. :) – leppie

+0

@leppie : 오 그래,이 코드가 언제 실행되는지 알지 못했습니다. 나는 이것이 Page_Init 또는이 작업을 위해 필요하다고 생각합니다 ... –

관련 문제