문제

나는 나는 어떤 고통스럽게 분명한 실수(s)는 볼 수 없습니다.나는 희망 하나의 설정할 수 있습니다 나선다.

나는 나 세션 관리로 완벽하게 작동하는 경우를 제외하고 사용자의 기계에 들어오는 데이터는 사용자 세션을 시작하고 다른 컴퓨터에서는 또한 무료 세션에서 정보를 처음이다.그렇게 좋지 않다.:(

나는 전화 세션을 다음과 같다:

UserInfo userinfo = UserInfo.Session;

내션 mgt 클래스를 사용:

static UserInfo userInfo;

static public UserInfo Session
{
    get
    {
        if (userInfo == null)
        {
            userInfo = new UserInfo();
            userInfo.ResetSessionTime();
        }
        return userInfo;
    }
}

내가 읽고 쓰는 데이터는 다음과 같다.나는 실현할 수 있는 직렬화하여 전체 클래스,하지만 그것처럼 보인다 더 많은 오버헤드를 직렬화하고 직렬화는 전체 클래스를 때마다 클래스라는 반대로 그냥을 잡는 하나 또는 두 개의 항목을 내가 필요합니다.

Decimal _latitude;
private String SessionValue(String sKey, String sValue, String sNewValue)
    {
        String sRetVal = "";
        if (sNewValue == null)//not wanting to update anything
        {
            if (sValue == null)//there is no existing value
            {
                sRetVal = (String)System.Web.HttpContext.Current.Session[sKey];
            }
            else
            {
                sRetVal = sValue;
            }
        }
        else
        {
            System.Web.HttpContext.Current.Session[sKey] = sNewValue;
            sRetVal = sNewValue;
        }
        return sRetVal;
    }



    public Decimal Latitude
    {
        get { return SessionValue("Latitude", _latitude); }
        set { _latitude = SessionValue("Latitude", _latitude, value); }
    }

당신의 도움에 대한 감사

도움이 되었습니까?

해결책

1)당신은 사용에 대한 통계 귀하의 사용자 정보 즉,이 클래스의 인스턴스가 하나 사이에 공유되는 모든 요청을 귀하의 웹 서버입니다.

2)당신은 단지 저장 값에서 세션(지 않는 사용자와 공유)또한 인스턴스에서 변수,이 경우 공유할 사용자.

그래서 값의 _latitude 일으키는 당신이 이 문제를 해결합니다.간단한 솔루션이:

public class Userinfo
{
    public Decimal Latitude
    {
        get { return System.Web.HttpContext.Current.Session["Latitude"]; }
        set { System.Web.HttpContext.Current.Session["Latitude"] = value; }
    }
}

더 나은,더 많은 가능한 버전이 될 것이다:

public class UserInfo
{
    private HttpSessionStateWrapper _session;
    public UserInfo(HttpSessionStateWrapper session)
    ( 
       // throw if null etc
       _session = session;
    )

    public Decimal Latitude
    {
        get { return _session["Latitude"]; }
        set { _session["Latitude"] = value; }
    }
}

에서 두 번째 인스턴스를 요청 내에서 당신은 단지 구축의 새 인스턴스 HttpSessionStateWrapper (를 사용하여 현재 세션)및 패스는 그것을 UserInfo 인스턴스입니다.테스트할 때,당신은 단지에 모의 래퍼입니다.

아무 상관없이,UserInfo 인스턴스 공유하지 않 사이션 작성해야와에서 직접 읽어 있습니다.지하려고 조기에 최적화하는 것을 유지하여 로컬 버전의 당신의 세션에 값입니다.지 않는 저장하시고 당신은 열기 자신을 버그가 있습니다.

다른 팁

사용자 정보를 정적 필드에 저장하기 때문에 발생합니다. 정적 인스턴스는 모든 요청간에 공유되며 응용 프로그램의 전체 수명을 살 수 있습니다.

다시 말해, 모든 사용자는 userInfo.session에서 동일한 userInfo 인스턴스를 얻게됩니다.

이것을 고칠 수 있습니다.

  • 전체 클래스를 세션으로 직렬화하십시오. 나는 당신이 어떤 다른 속성을 가지고 있는지 모르겠지만 너무 오버 헤드가 아니라고 생각합니다.
  • 요청 당 userInfo 인스턴스를 작성하여 사용자가 항상 새 인스턴스에서 읽히도록하여 세션의 값을 새로 고칠 것입니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top