2010-09-29 116 views
0

Scenerio - 我正在撰寫一個基於您使用的登錄框(database1和database2)的Web應用程序,它會將您連接到cooresponding數據庫。我已經設置了web.config來保存兩個連接字符串。在每個框的On_Authenticate方法中,我檢查用戶身份驗證,然後將基於登錄框的字符串發送到名爲Authenticate user的類中的公共變量。這個公共變量檢查cookie並從變量中獲取連接字符串名稱,如果cookie爲空,它將設置一個新的cookie,過期所有現有的cookie並設置cookie值。C#Cookie未保存其信息

現在,一旦完成,每次我打到數據庫(使用LINQ2SQL),我創建一個datacontext併發送AuthenticatedUser.ConnectionString。這將檢查cookie併發送獲取連接字符串用於提取數據。 Herer是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 /然而,在第一次真正的數據庫調用,我使用PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString);我得到一個空引用錯誤。它正在通過Get,它會檢查cookie並返回一個空的cookie。這裏會發生什麼?

回答

1

您需要將Cookie添加到Reponse.Cookies集合中,而不是設置Request.Cookies集合。只有Response中的cookie被髮送回用戶的瀏覽器。

+0

我正在打的是連接字符串名稱而不是實際的連接字符串。我將該名稱發送到GetConnectionStringFromName()以獲取連接字符串本身 – EvanGWatkins 2010-09-29 13:44:28

+0

@Evan - 對不起,我錯過了。那麼,所有您需要做的就是將cookie存儲在Response中。 – tvanfosson 2010-09-29 13:47:09

+0

謝謝,我不能相信我結束了。謝謝! – EvanGWatkins 2010-09-29 14:00:52