0

Scenerio-使用するログインボックス(database1とdatabase2)に基づいて、対応するデータベースに接続するWebアプリを作成しています。両方の接続文字列を保持するようにweb.configを設定しました。各ボックスのOn_Authenticateメソッドで、チェックしてユーザーを認証してから、ログインボックスに基づいた文字列をAuthenticateuserというクラスのパブリック変数に送信します。このパブリック変数はCookieをチェックし、変数から接続文字列名を取得します。Cookieがnullの場合、新しいCookieを設定し、既存のすべてのCookieを期限切れにして、Cookieの値を設定します。

これが完了すると、(LINQ2SQLを使用して)データベースにアクセスするたびに、データコンテキストを作成し、AuthenticatedUser.ConnectionStringを送信します。これにより、Cookieがチェックされ、データのプルに使用する接続文字列が送信されます。これがAuthenticatedUserクラスです...

public class AuthenticatedUser : System.Web.UI.Page
{
public static string ConnectionString
{
    get
    {
        HttpCookie myCookie = HttpContext.Current.Request.Cookies["connectionString"];
        return GetConnectionStringFromName(myCookie);
    }
    set
    {
        if (HttpContext.Current.Request.Cookies["connectionString"] != null)
        {
            ExpireCookies(HttpContext.Current);
        }
        var allCookies = HttpContext.Current.Request.Cookies.AllKeys;
        HttpCookie cookie = new HttpCookie("connectionString");
        cookie.Value = value;
        cookie.Expires = DateTime.Now.AddYears(100);
        HttpContext.Current.Request.Cookies.Add(cookie);
    }
}

private static string GetConnectionStringFromName(HttpCookie myCookie)
{
    string connectionStringName = myCookie.Value;
    return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
}

private static void ExpireCookies(HttpContext current)
{
    var allCookies = current.Request.Cookies.AllKeys;
    foreach (var cook in allCookies.Select(c => current.Response.Cookies[c]).Where(cook => cook != null))
    {
        cook.Value = "";
        cook.Expires = DateTime.Now.AddDays(-1);
        current.Request.Cookies.Remove(cook.Name);
        cook.Name = "";
    }
} 

}

これで、ログインからの最初のクリックで機能しているようです。ユーザー情報を入力してプロセスを進めると、設定されているCookieが表示されます/ただし、使用する最初のtrueデータベース呼び出しでPortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString); 、null参照エラーが発生します。Getを実行し、Cookieをチェックして、nullCookieを返します。ここで何が起こっているのでしょうか?

4

1 に答える 1

1

Request.Cookies コレクションの代わりに設定する場合は、Reponse.Cookies コレクションに Cookie を追加する必要があります。レスポンス内の Cookie のみがユーザーのブラウザに送り返されます。

于 2010-09-29T13:43:13.553 に答える