2012-10-08 47 views
0

我有一個Web角色託管Unity3D應用程序。在應用程序中,我有一個連接屏幕。與其他連接屏幕一樣,您可以填寫登錄名和密碼以訪問應用程序的核心(例如遊戲)。Windows Azure數據庫實體框架DbContext和MergeOptions

所有這些信息都存儲在Windows Azure Database中,我可以使用管理面板創建用戶。該面板託管在另一個Web角色中,可以訪問數據庫。

如果我創建一個新用戶,我可以連接到我的應用程序中的這些信息。沒有問題。但是現在,如果我想使用管理面板更改用戶密碼,則數據庫中的值會發生很大變化,但在我的應用程序中,我無法連接新密碼,因此始終使用舊密碼。

用戶創建和密碼更改通過Razor Entity Framework完成。

我不明白,因爲在我的Unity3D application中,我向Web角色和用戶控制器發出請求,並且角色返回舊密碼而不是新密碼。但在我的數據庫和我的管理面板中有新的...這怎麼可能?我該如何解決這個問題?

它是響應緩存問題嗎?

我如何找到並回報用戶:

DatabaseContext db = DatabaseContextProvider.WebDatabase; 
string login = Request.Form["login"]; //The login typed by user 
var users = from u in db.Users where u.Login == login select u; 
User[] userArray = users.ToArray<User>(); 

然後,我充滿了像
Response.AddHeader("data", userArray[0].data.ToString());

如果需要,可以幫助你解決我的問題,任何信息只是問一些頭的響應Unity3D 。

非常感謝您的幫助!

+0

請更好地描述你的問題(你可以編輯它)。例如,您如何「更改密碼」並不清楚,「管理控制檯」 - 您的應用程序的一部分或Windows Azure管理門戶在哪裏?你還在哪裏創建SQL Azure DB中的用戶?他們是SQL Azure用戶還是應用程序用戶?你正在使用的Unity應用程序是什麼? Microsoft Ent.Lib。團結還是別的?如果它是MS Ent.Lib,您是否爲Unity配置了緩存? – astaykov

+0

我添加了一些信息,告訴我是否需要更多信息。 – MaT

+0

如果您更改密碼,用戶的ID不應該保持不變嗎? –

回答

1

發現了問題,這是造成實體框架:
Entity Framework and DbContext - Object Tracking
http://msmvps.com/blogs/kevinmcneish/archive/2010/02/16/setting-entity-framework-mergeoptions-what-works-what-doesn-t.aspx

以前

DatabaseContext db = DatabaseContextProvider.WebDatabase; 
string login = Request.Form["login"]; 
var users = from u in db.Users where u.Login == login select u; 
User[] userArray = users.ToArray<User>(); 

現在

DatabaseContext db = DatabaseContextProvider.WebDatabase; 
string login = Request.Form["login"]; 
ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext; 
ObjectSet<User> set = objectContext.CreateObjectSet<User>(); 
set.MergeOption = MergeOption.OverwriteChanges; 
var users = from u in set where u.Login == login select u; 
User[] userArray = users.ToArray<User>(); 

@Sandrino Di Mattia:謝謝你幫我找到答案!

0

如果你可以看到在數據庫中的新密碼,但控制器返回舊密碼嘗試通過創建以下ActionFilter並將其添加到您的行動恢復密碼(as described here)禁用緩存:

public class NoCacheAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
     filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); 
     filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
     filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     filterContext.HttpContext.Response.Cache.SetNoStore(); 

     base.OnResultExecuting(filterContext); 
    } 
} 

而就在旁邊,你爲什麼要返回密碼?用戶名/密碼驗證應該發生在服務器端,應該在驗證成功後簡單地返回true/false或令牌。從安全的角度來看,返回密碼(即使哈希)也不是一個好主意。

+0

不幸的是,它似乎並沒有工作。我不明白,因爲正如你對我說的這是一個緩存問題... – MaT

+0

響應標題有所有好的條目,如:no-cache,no-store,-1等......但提供的散列不是與db中的一樣。順便說一句,我會改變識別的過程。 – MaT

+0

您還可以在獲取數據時顯示一些您正在編寫的代碼嗎? –