문제

사용자가 뒤로 버튼을 사용하여 웹 페이지로 돌아갈 때 다른 사람으로 돌아 오는 것을보고합니다. 다른 사용자 프로필에 액세스하는 것 같습니다.

코드의 중요한 부분은 다음과 같습니다.

//here's the code on the web page

public static WebProfile p = null;

protected void Page_Load(object sender, EventArgs e)
{
    p = ProfileController.GetWebProfile();
    if (!this.IsPostBack)
    {
         PopulateForm();
    }       
}

//here's the code in the "ProfileController" (probably misnamed)
public static WebProfile GetWebProfile()
{
    //get shopperID from cookie
    string mscsShopperID = GetShopperID();
    string userName = new tpw.Shopper(Shopper.Columns.ShopperId,        mscsShopperID).Email;
    p = WebProfile.GetProfile(userName); 
    return p;
}

정적 메소드와 a를 사용하고 있습니다 static WebProfile 프로필 객체를 사용해야하기 때문에 static WebMethod (Ajax pageMethod).

  • 이로 인해 프로필 객체가 다른 사용자가 "공유"할 수 있습니까?
  • 정적 메소드와 객체를 올바르게 사용하지 않습니까?

내가 변경 한 이유 WebProfile A에 반대 static 개체는 내가 [WebMethod] (페이지의 JavaScript에서 호출).

  • 내에서 프로필 객체에 액세스하는 방법이 있습니까? [WebMethod]?
  • 그렇지 않다면 어떤 선택을해야합니까?
도움이 되었습니까?

해결책

정적 객체는 응용 프로그램의 모든 인스턴스에서 공유되므로 정적 객체의 값을 변경하면 해당 객체에 액세스하는 응용 프로그램의 모든 인스턴스에 따라 변경이 반영됩니다. 따라서 현재 사용자를 위해 설정하는 다른 스레드 (즉, 페이지를 방문하는 두 번째 사용자)에 의해 웹 프로필이 재 할당되면, 현재 사용자를 위해 설정하는 것과 다른 정보가 포함됩니다.

이 문제를 해결하려면 코드가 다음과 같습니다.

public WebProfile p = null;

protected void Page_Load(object sender, EventArgs e)
{
    p = ProfileController.GetWebProfile();
    if (!this.IsPostBack)
    {
         PopulateForm();
    }       
}

public static WebProfile GetWebProfile()
{
    //get shopperID from cookie
    string mscsShopperID = GetShopperID();
    string userName = new tpw.Shopper(Shopper.Columns.ShopperId,        mscsShopperID).Email;
    return WebProfile.GetProfile(userName); 
}

정적 객체가 설정되지 않았으며 반환 된 값은 호출 방법에서 웹 프로파일 클래스의 정적 인스턴스에 할당되어야합니다.

또 다른 옵션은 사용중인 시간 동안 정적 변수를 잠그는 것이지만, 이는 잠금이 현재 잠금 스레드가 완료 될 때까지 자원에 대한 다른 요청을 차단하기 때문에 성능의 심각한 저하로 이어질 것입니다. 웹 앱.

다른 팁

@geri

프로필이 종종 사용자에게 변경되지 않으면 현재 세션 상태에 저장할 수있는 옵션이 있습니다. 이렇게하면 메모리 오버 헤드가 발생하지만 프로필의 크기와 동시 사용자 수에 따라 문제가되지 않을 수 있습니다. 당신은 다음과 같은 일을 할 것입니다.

public WebProfile p = null;
private readonly string Profile_Key = "CurrentUserProfile"; //Store this in a config or suchlike

protected void Page_Load(object sender, EventArgs e)
{
    p = GetProfile();

    if (!this.IsPostBack)
    {
        PopulateForm();
    }       
}

public static WebProfile GetWebProfile() {} // Unchanged

private WebProfile GetProfile()
{
    if (Session[Profile_Key] == null)
    {
        WebProfile wp = ProfileController.GetWebProfile();
        Session.Add(Profile_Key, wp);
    }
    else
        return (WebProfile)Session[Profile_Key];
}

[WebMethod]
public MyWebMethod()
{
    WebProfile wp = GetProfile();
    // Do what you need to do with the profile here
}

따라서 프로파일 상태가 필요할 때마다 세션에서 검색되며 정적 변수의 필요성을 해결해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top