1

セッション変数として保存する必要がある Serializable としてマークされたユーティリティ クラスがあります。そのクラスは次のとおりです。

[Serializable]
    public class NameValuePair<TName, TValue>
    {
        public TName Name { get; set; }
        public TValue Value { get; set; }

        public NameValuePair(TName name, TValue value)
        {
            Name = name;
            Value = value;
        }

        public NameValuePair() { }
    }    

私の NancyModule クラスは Cookie を適切に逆シリアル化できず、null の Request.Session オブジェクトを取得します。

セッションがどのように設定されるかの進行は次のとおりです。

LoginModule はユーザーを検証してから、セッションに入力します。

Request.Session["UserId"] = user.Id;
Request.Session["TimeZoneId"] = user.TimeZoneId;
Request.Session["StandardStartTime"] = user.StandardStartTime;
Request.Session["StandardEndTime"] = user.StandardEndTime;

var nvp = new NameValuePair<string, int>() { Name = "Davie", Value = 777};
Request.Session["NVP"] = nvp;

後続のモジュールでは、Session オブジェクトは null です。セッションから nvp オブジェクトを削除すると、逆シリアル化が適切に行われ、値が返されます。どんな洞察も役に立ちます。

4

1 に答える 1

1

UserId をセッションに保存しないでください。

Nancy はセッションに Cookie を使用するため、Cookie はクライアントに送信されます。Cookie が暗号化されているかどうかに関係なく、機密情報をクライアントに送信しないでください。

Cookie オブジェクト シリアライザーの既定の実装は、Mono のバイナリ シリアライザーです。推測では、オブジェクトのシリアル化によって作成される Cookie が大きすぎると思います。そのため、Cookie が無効であるため、作成されていない可能性があります。

セッションに保存しないとこれを実行できない理由はありますか。このデータは、データベースから簡単に取得できる必要があります。多数のユーザー設定がある場合は、オブジェクト自体をデータベースに保存してから、ID でクエリを実行します。

「ああ、でもリクエストごとにデータベースにアクセスする必要がある」と主張することもできますが、私の意見では、それは正当な理由ではありません。Get by Id は、データベースで取得するのと同じくらい高速であり、1 億件のレコードが即座に返される場合でも同様です。


基本モジュールを使用すると、プレフックを追加してユーザー設定を照会し、それらをプロパティにアタッチして、すべてのモジュールからアクセスできるようにすることができます。

于 2013-11-13T01:42:50.727 に答える