2014-09-01 46 views
0

我們開始將我們的旗艦應用程序從ASP.NET Webforms遷移到ASP.NET MVC。由於它幾乎是一個重寫,我們試圖獲得儘可能多的好新功能。其中之一是新奇的async。我們正試圖讓所有的控制器和動作(當然是有道理的)async希望獲得更好的性能。如何獲得使用ASP.NET MVC和異步的Response.Redirect?

但是我遇到的問題是Response.Redirect甚至Server.Transfer方法只是掛起請求。它看起來像是某處出現死鎖。

這是一個遺憾,因爲我們非常習慣於Response.Redirect方法,它會中止您正在做的所有事情並重定向整個請求。非常方便,至少在webforms中(使POST-REDIRECT-GET模式易於使用)。

此外,也許更重要的是,Response.RedirectServer.Transfer用於我們的Application_Error處理程序,它將請求傳輸到錯誤頁面。我甚至不知道可以在那裏使用的任何替代品。

那麼......有沒有辦法讓Response.Redirect恢復生機?

+0

@Richard - 這個問題是關於ASP.NET Webforms的。這個是關於MVC的。另外,在這個問題中,有人建議通過傳遞'false'作爲第二個參數(不中止請求,只設置重定向頭)來基本放棄'Response.Redirect'。在這裏,我正在尋求一種方法,即使使用'true'作爲第二個參數,它也能工作。所以我真的不認爲他們是重複的。 – 2014-09-01 12:47:05

+0

請記住,重定向API在WebForms和MVC中是相同的......此外,鏈接的文章還顯示了在錯誤情況下如何避免中止使用重定向兼容版本的線程(昂貴)。 – Richard 2014-09-01 13:39:41

+0

@Richard - 是的,但該方法涉及傳遞任何適當的返回代碼。那麼我不妨使用'RedirectResult'。相反,我想看看,如果我能以某種方式保持從我的代碼中的任何地方執行重定向和中止請求的能力。我和我的其他程序員都非常習慣這種做法。 – 2014-09-01 15:02:25

回答

0

您可能希望將您的動作返回類型更改爲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操作。

+0

所以...這是如何使Response.Redirect()工作? – 2014-09-01 15:00:12

+0

它實際上並沒有使這個調用起作用,它是一個如何在web api中重定向響應的例子。 – 2014-09-02 15:16:53

+0

如何重定向到相對URL? – JerryGoyal 2016-12-26 12:31:24