c#stateserver 유지 세션 사이에 컴퓨터
-
10-07-2019 - |
문제
나는 나는 어떤 고통스럽게 분명한 실수(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 인스턴스를 작성하여 사용자가 항상 새 인스턴스에서 읽히도록하여 세션의 값을 새로 고칠 것입니다.