1

次の方法を使用してショッピングカートセッションを作成します http://net.tutsplus.com/tutorials/other/build-a-shopping-cart-in-aspnet/

現在、セッション状態モードがデフォルトでinProcである私のマシンでローカルに実行されていますが、すべて正常に動作しているようです。

ホスティングプロバイダー(共有ホスティング環境など)に配置したばかりのアプリケーションを作成しています。それらのデフォルトのsessionstateはstateserverであるため、これに適合するようにクラスをシリアル化する必要がありました。クッキーを使用しています。

バスケット(追加、削除など)は正常に機能しますが、セッションの永続性に関していくつかの奇妙なことが起こります。

ローカルマシンで、2つの別々のブラウザーでサイトにアクセスした場合、IEでアイテムを追加すると、更新したときにFirefoxでそれらを表示できます。Cookieはブラウザごとにあるため、これは私には意味がありません。

さらに、セッションが生成されたとき、そのIDは一意であるため、あるユーザーが別のセッションデータを表示できるようにする方法はないと思いました(おそらく同じブラウザーでタブが付けられていない限り)

さらに悪いことに、IEでアイテムの追加/削除を開始し、Firefoxでも同様の操作を行うと、ブラウザーを更新するたびに、どちらも非常にランダムなカートの結果を表示します。

何か案は?困った!クラスとセッションを生成するためのコードは、上記のリンクとほぼ同じです。

4

1 に答える 1

1

サンプルを詳しく調べたわけではありませんが、シングルトンの実装については非常に心配です。

public static readonly ShoppingCart Instance;

これは ASP.Net Web アプリケーションであるため、ユーザー セッションごとに 1 つのインスタンスではなく、Web サイトに接続するすべてのユーザーに対して 1 つのショッピング カートを使用します。これは明らかに良い設計ではありません。

実際、コメント セクションに「すべてのユーザーに同じカートを使用するのではなく、新しいカートを作成する方法を教えてください」と尋ねたユーザーが少なくとも 1 人います。

私はあなたがこれらの線に沿って何かをした方が良いと思います:

変化する:

public static readonly ShoppingCart Instance;  

に:

// Method to retrieve the current user's shopping cart, stored in their session
public static ShoppingCart Instance() {

    ShoppingCart value;

    // If the cart is not in the session, create one and put it there  

    // Otherwise, get it from the session  
    if (HttpContext.Current.Session["ASPNETShoppingCart"] == null) {  
        value = new ShoppingCart();  
        value.Items = new List<CartItem>();  
        HttpContext.Current.Session["ASPNETShoppingCart"] = value;  
    } else {  
        value = (ShoppingCart)HttpContext.Current.Session["ASPNETShoppingCart"];  
    }  
    return value;
}  

次に、静的コンストラクターを完全に削除します。

ShoppingCart.Instance.コードの残りの部分で行う必要がある唯一の変更は次のとおりです。ShoppingCart.Instance().

于 2011-12-01T02:46:16.560 に答える