2010-01-02 4 views
2

Как перенаправление работает в ASP.Net MVC?Общие сведения о перенаправлении в ASP.Net MVC

Я скопировал и модифицировал code bit from Scott Henselman's blog, который использует DotNetOpenId для входа через OpenID. Отладка, я считаю, что при выполнении этого сегмента кода:

// Stage 2: user submitting Identifier 
var openId = Request.Form["openId"]; 
new OpenIdRelyingParty().CreateRequest(openId).RedirectToProvider(); 
throw new Exception("Should never get here"); 

Я никогда не добраться до пункта броска, а продолжить с перенаправлением. Как это работает?

Тогда, когда я получаю ответ от поставщика 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() не вернется, и мне нужно вернуть что-то из действия. Что я должен здесь вернуться?

ответ

0

Проверьте этот сайт link text, они охватывают перенаправление на другое действие и передачу ему информации.

2

В первом примере метод 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 Response.Redirect был вашим единственным вариантом (ну, на самом деле, но это не показалось). Но ASP.NET MVC предлагает RedirectAction, который позволяет вам вызывать переадресацию браузера, не бросая исключение. И DotNetOpenAuth (преемник DotNetOpenId) предлагает способ использовать эту функцию.

Как shown here вы можете перенаправить к провайдеру, возвращая результат IAuthenticationRequest.RedirectingResponse.AsActionResult() из действия вашего контроллера, чтобы инициировать логин вместо вызова IAuthenticationRequest.RedirectToProvider().

Кроме того, вы можете зарегистрировать пользователя на своем сайте, не используя FormsAuthentication.RedirectFromLoginPage, позвонив по телефону FormsAuthentication.SetAuthCookie, а затем return Redirect(...) в действие вашего контроллера, чтобы отправить пользователя в пункт назначения.

+0

Я нахожу, что FormsAuthentication.RedirectFromLoginPage() не генерирует исключение, а выполнение продолжается после него. Что может быть причиной этого? – ripper234

+0

Хммм ... в этом случае этот метод может установить свойство Response.RedirectLocation' и просто вернуть, что приведет к переадресации, но не к исключению, что позволит продолжить выполнение. –

+0

Но чем же я должен вернуться из действия контроллера? – ripper234

Смежные вопросы