C# 如何使用ASP.NET MVC和async获取响应。重定向?
我们开始将旗舰应用程序从ASP.NET Webforms迁移到ASP.NET MVC。由于这几乎是一个重写,我们正试图获得尽可能多的好的新功能。其中一种是新型的C# 如何使用ASP.NET MVC和async获取响应。重定向?,c#,asp.net,asp.net-mvc,asp.net-mvc-4,redirect,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Redirect,我们开始将旗舰应用程序从ASP.NET Webforms迁移到ASP.NET MVC。由于这几乎是一个重写,我们正试图获得尽可能多的好的新功能。其中一种是新型的async。我们试图使所有的控制器和动作异步(当然,这是有意义的),以期获得更好的性能 然而,我遇到的问题是Response.Redirect甚至Server.Transfer方法只是挂起请求。好像有什么东西在某处死锁了 这是一个遗憾,因为我们已经习惯了Response.Redirect方法,它中止您正在做的一切,只重定向整个请求。非常方
async
。我们试图使所有的控制器和动作异步(当然,这是有意义的),以期获得更好的性能
然而,我遇到的问题是Response.Redirect
甚至Server.Transfer
方法只是挂起请求。好像有什么东西在某处死锁了
这是一个遗憾,因为我们已经习惯了Response.Redirect
方法,它中止您正在做的一切,只重定向整个请求。非常方便,至少在webforms中是这样(使POST-REDIRECT-GET模式易于使用)
另外,也许更重要的是,Response.Redirect
和Server.Transfer
在我们的Application\u Error
处理程序中使用,它将请求传输到错误页面。我甚至不知道在那里可以使用什么替代品
所以。。。我们无法将响应。重定向恢复生命吗?您可能希望将操作返回类型更改为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;
});
}
公共任务操作()
{
返回Task.Factory.StartNew(()=>
{
HttpResponseMessage response=新的HttpResponseMessage(HttpStatusCode.Redirect);
response.Headers.Location=新Uri(“http://stackoverflow.com");
返回响应;
});
}
上述代码将异步处理api操作,返回重定向代码和头以重定向浏览器。@Richard-这个问题是关于ASP.NET Webforms的。这是关于MVC的。另外,在这个问题中,建议基本上放弃Response.Redirect
,将false
作为第二个参数传递(不中止请求,只设置重定向头)。在这里,我想找到一种方法,使它即使将true
作为第二个参数也能工作。所以我真的不认为它们是重复的。记住重定向API在WebForms和MVC中是相同的。。。另外,链接文章还介绍了在错误情况下如何避免中止使用兼容版本重定向的线程(代价高昂)。@Richard-是的,但这种方法涉及传递任何适当的返回代码。我不妨使用RedirectResult
。相反,我想看看我是否能够以某种方式保持从代码中的任何位置执行重定向和中止请求的能力。我和我的程序员同事都非常习惯这种做法。所以。。。这如何使Response.Redirect()
工作?它实际上并没有使调用工作,它只是一个示例,说明如何在web api中重定向响应。如何重定向到相对URL?
public Task<HttpResponseMessage> Action()
{
return Task.Factory.StartNew(() =>
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Redirect);
response.Headers.Location = new Uri("http://stackoverflow.com");
return response;
});
}