2010-01-02 28 views
2

重定向如何在ASP.Net MVC中工作?瞭解ASP.Net中的重定向MVC

我複製並修改了使用DotNetOpenId通過OpenID登錄的code bit from Scott Henselman's blog。調試,我發現執行此代碼段時:

// Stage 2: user submitting Identifier 
var openId = Request.Form["openId"]; 
new OpenIdRelyingParty().CreateRequest(openId).RedirectToProvider(); 
throw new Exception("Should never get here"); 

我永遠不會到達throw子句,而是繼續進行重定向。這是如何運作的?

然後,當我得到的OpenID提供商的響應,我調試通過這個代碼段:

switch (response.Status) 
{ 
    case AuthenticationStatus.Authenticated: 
    FormsAuthentication.RedirectFromLoginPage(response.ClaimedIdentifier, false); 
    // am I supposed to reach this line? What should I return here? 
    // (The method expects a View to be returned) 

而且我發現,調用FormsAuthentication.RedirectFromLoginPage()不會返回,我需要從Action返回一些內容。我應該回到這裏?

回答

0

查看本網站link text他們涵蓋了重定向到另一個行動並將信息傳遞給它。

2

在第一個示例中,RedirectToProvider()方法調用ASP.NET Response.Redirect()方法。這種方法,由ASP.NET本身實現,拋出異常ThreadAbortException具體)。這就是爲什麼你永遠不會去throw new Exception("Should never get here");線。但請注意,雖然它永遠不會到達,但仍必須出現throw,因爲它允許C#知道該方法可驗證和安全的代碼不需要任何return語句。

FormsAuthentication.RedirectFromLoginPage方法最終還會調用Response.Redirect,這意味着它也會引發異常。但是因爲你下面沒有throw聲明,所以C#要求你返回一些東西。當你使用返回類型的方法時,C#要求你返回或拋出每個可能的出口點。

在ASP.NET web表單中,Response.Redirect是您唯一的選擇(當然,並不是真的,但看起來像是這樣)。但ASP.NET MVC提供了一個RedirectAction,它允許你發出瀏覽器重定向,而不會拋出異常。 DotNetOpenAuth(DotNetOpenId的後繼者)提供了一種利用此功能的方法。

作爲shown here您可以通過從控制器的操作中返回IAuthenticationRequest.RedirectingResponse.AsActionResult()的結果來重定向到提供程序,以啓動登錄而不是調用IAuthenticationRequest.RedirectToProvider()

另外,還可以使用戶登錄到你的網站,而無需使用FormsAuthentication.RedirectFromLoginPage通過調用FormsAuthentication.SetAuthCookie,然後return Redirect(...)控制器的操作中給用戶發送到他的目的地。

+0

我發現FormsAuthentication.RedirectFromLoginPage()不會引發異常,而是執行後會繼續執行。什麼會造成這種情況? – ripper234 2010-01-02 21:20:14

+0

嗯...在這種情況下,該方法可能會設置Response.RedirectLocation屬性並返回,這將導致重定向但不是異常,從而允許執行繼續。 – 2010-01-02 23:05:55

+0

但是我應該從控制器操作返回什麼? – ripper234 2010-01-05 22:05:37