2014-09-01 3 views
0

Мы начинаем переносить наше флагманское приложение из ASP.NET Webforms в ASP.NET MVC. Поскольку это в значительной степени переписывается, мы пытаемся получить как можно больше хороших новых функций. Один из них - новомодный async. Мы пытаемся сделать все контроллеры и действия async (где это имеет смысл, конечно) в надежде получить лучшую производительность.Как получить Response.Redirect работать с ASP.NET MVC и async?

Однако проблема, с которой я столкнулся, заключается в том, что Response.Redirect и даже методы Server.Transfer просто повесить запрос. Похоже, что-то где-то в тупике.

Это очень жаль, потому что мы довольно привыкли к методу Response.Redirect, который прерывает все, что вы делаете, и просто перенаправляет весь запрос. Довольно удобно, по крайней мере в веб-формах (упрощает использование шаблона POST-REDIRECT-GET).

Также, возможно, что более важно, Response.Redirect и Server.Transfer используется в нашем обработчике Application_Error, который передает запрос на страницу с ошибкой. Я даже не знаю никаких альтернатив, которые можно было бы там использовать.

Итак ... нет способа, как мы можем вернуть Response.Redirect к жизни?

+0

@ Рихард - Этот вопрос касается веб-форм ASP.NET. Это о MVC. Кроме того, в этом вопросе было предложено отказаться от «Response.Redirect», передав «false» в качестве второго параметра (не прерывает запрос, просто устанавливает заголовки переадресации). Здесь я прошу о том, чтобы заставить его работать даже с «истинным» как вторым параметром. Поэтому я действительно не думаю, что они дубликаты. –

+0

Помните, что API-адреса переадресации одинаковы для WebForms и MVC ... Кроме того, связанная статья показывает, что делать в случае ошибки, чтобы избежать прерывания потоков (дорогостоящих), использующих версию переадресации совместимости. – Richard

+0

@ Рихард - Да, но этот подход предполагает передачу любых соответствующих кодов возврата. Тогда я мог бы использовать «RedirectResult». Вместо этого я хочу видеть, могу ли я как-то сохранить возможность выполнять запрос перенаправления и прерывания из любого места в моем коде. И я, и мои коллеги-программисты очень привыкли к этой практике. –

ответ

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()' work? –

+0

На самом деле это не делает работу с вызовом, это пример того, как вы можете перенаправить ответ в веб-api. –

+0

Как перенаправить на относительный URL? – JerryGoyal