1

戻るボタンを使用してWebページに戻ると、別の人として戻ってきたと報告しているユーザーがいます。別のユーザープロファイルにアクセスしている可能性があります。

コードの重要な部分は次のとおりです。

//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;
}

(ajax )static WebProfileでプロファイルオブジェクトを使用する必要があるため、静的メソッドとを使用しています。 static WebMethodpageMethod

  • これにより、プロファイルオブジェクトがさまざまなユーザーによって「共有」される可能性がありますか?
  • 静的メソッドとオブジェクトを正しく使用していませんか?

WebProfileオブジェクトをオブジェクトに変更した理由は、 (ページのjavascriptから呼び出された)static内のプロファイルオブジェクトにアクセスする必要があるためです。[WebMethod]

  • 内のプロファイルオブジェクトにアクセスする方法はあります[WebMethod]か?
  • そうでない場合、どのような選択肢がありますか?
4

2 に答える 2

1

@ジェリ

ユーザーのプロファイルが頻繁に変更されない場合は、現在のセッション状態でプロファイルを保存するオプションがあります。これにより、メモリオーバーヘッドが発生しますが、プロファイルのサイズと同時ユーザーの数によっては、これは問題にならない可能性があります。あなたは次のようなことをするでしょう:

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
}

プロファイルの状態が必要に応じてセッションから取得され、静的変数の必要性を回避できるようにします。

于 2008-09-25T08:54:18.607 に答える
1

静的オブジェクトはアプリケーションのすべてのインスタンスで共有されるため、静的オブジェクトの値を変更すると、その変更はそのオブジェクトにアクセスするアプリケーションのすべてのインスタンスに反映されます。したがって、Web プロファイルが別のスレッド (つまり、2 番目のユーザーがページを訪問) によって再割り当てされた場合、現在のユーザーに設定する間に、期待したものとは異なる情報が含まれます。

これを回避するには、コードは次のようになります。

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); 
}

静的オブジェクトが設定されていないことに注意してください。戻り値は、呼び出し元のメソッドで Web プロファイル クラスの NON STATIC インスタンスに割り当てる必要があります。

別のオプションは、静的変数を使用中ずっとロックすることですが、現在のロックスレッドが完了するまでロックがリソースに対する他のリクエストをブロックするため、パフォーマンスが大幅に低下します。ウェブアプリ。

于 2008-09-24T18:24:15.797 に答える