2

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

从 Scott Henselman 的博客中复制并修改了代码位,该博客使用 DotNetOpenId 通过 OpenID 登录。调试,我发现在执行这段代码时:

// 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 中返回一些东西。我应该在这里返回什么?

4

1 回答 1

2

在您的第一个示例中,该RedirectToProvider()方法调用 ASP.NETResponse.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 的继承者)提供了一种利用此功能的方法。

如此处所示,您可以通过从控制器的操作返回结果来重定向到提供程序IAuthenticationRequest.RedirectingResponse.AsActionResult()以启动登录,而不是调用IAuthenticationRequest.RedirectToProvider().

此外,您可以将用户登录到您的站点,而无需FormsAuthentication.RedirectFromLoginPage通过调用FormsAuthentication.SetAuthCookie然后return Redirect(...)在控制器的操作中将用户发送到他的目的地。

于 2010-01-02T20:41:29.953 回答