【问题标题】:How to get Response.Redirect working with ASP.NET MVC and async?如何让 Response.Redirect 与 ASP.NET MVC 和异步一起工作?
【发布时间】:2014-09-01 12:17:25
【问题描述】:

我们开始将我们的旗舰应用程序从 ASP.NET Webforms 迁移到 ASP.NET MVC。由于它几乎是一次重写,因此我们正试图获得尽可能多的新功能。其中之一是新奇的async。我们正在尝试制作所有控制器和操作async(当然,这是有意义的),希望获得更好的性能。

但是我遇到的问题是Response.Redirect 甚至Server.Transfer 方法只是挂起请求。看起来某处出现了死锁。

很遗憾,因为我们已经习惯了Response.Redirect 方法,它会中止您正在执行的所有操作并重定向整个请求。非常方便,至少在网络表单中(使 POST-REDIRECT-GET 模式易于使用)。

此外,也许更重要的是,Response.RedirectServer.Transfer 用于我们的 Application_Error 处理程序,它将请求转移到错误页面。我什至不知道那里可以使用任何替代品。

那么……我们有没有办法让Response.Redirect 起死回生?

【问题讨论】:

  • @Richard - 这个问题是关于 ASP.NET Webforms 的。这个是关于 MVC 的。此外,在那个问题中,建议通过将false 作为第二个参数传递来基本上放弃Response.Redirect(不中止请求,只是设置重定向标头)。在这里,我要求一种方法使其即使使用 true 作为第二个参数也能正常工作。所以我真的不认为它们是重复的。
  • 记住重定向 API 在 WebForms 和 MVC 中是相同的......另外,链接的文章显示了在错误情况下如何避免中止使用重定向兼容版本的线程(昂贵)。
  • @Richard - 是的,但这种方法涉及传递任何适当的返回码。那我不妨使用RedirectResult。相反,我想看看,如果我能以某种方式保持从代码中的任何位置执行重定向和中止请求的能力。我和我的程序员同事都非常习惯这种做法。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 redirect


【解决方案1】:

您可能希望将您的操作返回类型更改为 HttpResponseMessage(如果还没有),以便您可以更好地控制返回给浏览器的内容。

public Task<HttpResponseMessage> Action()
{
    return Task.Factory.StartNew(() =>
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Redirect);
        response.Headers.Location = new Uri("http://stackoverflow.com");
        return response;
    });
}

上面的代码会异步处理一个api动作,返回一个重定向代码和header来重定向浏览器。

【讨论】:

  • 那么...这如何使Response.Redirect() 工作?
  • 它实际上并没有使该调用起作用,它是如何在 web api 中重定向响应的示例。
  • 如何重定向到相对 URL?
猜你喜欢
  • 2011-04-17
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多