【问题标题】:Understanding Redirections in ASP.Net MVC了解 ASP.Net MVC 中的重定向
【发布时间】:2010-01-02 14:20:36
【问题描述】:

重定向在 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 中返回一些内容。我应该在这里返回什么?

【问题讨论】:

    标签: asp.net-mvc redirect dotnetopenauth


    【解决方案1】:

    在您的第一个示例中,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.SetAuthCookiereturn Redirect(...) 以将用户发送到他的目的地。

    【讨论】:

    • 我发现 FormsAuthentication.RedirectFromLoginPage() 没有抛出异常,而是在它之后继续执行。什么可能导致这种情况?
    • 嗯...在这种情况下,该方法可能会设置Response.RedirectLocation 属性并返回,这将导致重定向但不是异常,从而允许继续执行。
    • 那么我应该从控制器操作中返回什么?
    • 我怀疑你可以return new EmptyAction() 并且它(我认为)应该可以工作。如果这不起作用,您可以随时return Redirect(Request.QueryString["ReturnUrl"] ?? FormsAuthentication.DefaultUrl)自己。
    • Response.Redirect 有两种类型,一种是立即的并导致线程中止异常,另一种允许请求继续执行但完成后会发送重定向。 RedirectFromLoginPage 使用 Response.Redirect(url, false),Response.Redirect(url) 与 Response.Redirect(url,true) 相同。布尔参数确定重定向是否是立即的。
    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2010-12-23
    • 2011-06-25
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多