2014-01-02 11 views
2

Пытаюсь следующее:Переадресация WebAPI не работает?

[System.Web.Http.AcceptVerbs("PUT")] 
    public HttpResponseMessage MakePost(PostDto post) { 
     try { 
      var response = Request.CreateResponse(HttpStatusCode.Redirect); // tried MOVED too 
      response.Headers.Location = new Uri("google.com"); 
      return response; 
     } catch (Exception e) { 
      ErrorSignal.FromCurrentContext().Raise(e); 
      return Request.CreateResponse(HttpStatusCode.InternalServerError, e); 
     } 
    } 

который, кажется, частично работает - когда это называется, я вижу запрос POST в хромированном отладчике. Ничто не появляется на вкладке Response, но я вижу запрос GET отправляется в новый URI, но страница никогда не меняется, и мой AJAX вызов выдает ошибку:

var options = { 
     url: postUrl, 
     type: type, 
     dataType: 'json', 
     xhrFields: { 
      withCredentials: true 
     } 
    }; 
return $.ajax(options) 
     .done(function (response) { 
      // do stuff 
     }) 
     .fail(function (response) { 
      alert('error) // this gets hit - shouldn't the browser have redirected at this point? 
     }).complete(function() { 
      // stuff 
     }); 
}; 

Если я инспектировать ответ, я вижу статус 200 «ОК» ... Я так смущен.

Что я делаю неправильно?

+2

Ваши ожидания в отношении перенаправления, вероятно, неверны ... Перенаправление - это всего лишь ответ 302, который браузер будет рассматривать как «теперь перейдите на эту страницу, прежде чем возвращаться к этому запросу AJAX». Поскольку перенаправление является результатом междоменного, не может быть прочитано .... –

ответ

6

Это происходит потому, что код, выдающий запрос AJAX, следует за перенастройкой, а не с браузером. Это приведет к сбою, поскольку запрос AJAX пытается получить доступ к другому домену. Если вы хотите перенаправить браузер, вы должны вернуть какой-то результат JSON или собственный HTTP-заголовок, вручную забрать его в своем jQuery и сделать там перенаправление.

В контроллере:

var response = new HttpResponseMessage(HttpStatusCode.OK); 
response.Headers.Add("FORCE_REDIRECT", "http://google.com"); 

Затем добавить успех обратного вызова на ваш вызов AJAX:

success: function(data, textStatus, jqXHR) { 
    if (jqXHR.getResponseHeader('FORCE_REDIRECT') !== null){ 
     window.location = jqXHR.getResponseHeader('FORCE_REDIRECT'); 
     return; 
    } 
} 

В прошлом, я завернул результат контроллера в пользовательский класс результат действия для повторного использования.

+0

Thanks Ant. Есть ли что-то не так, если вы напрямую привязываете URL-адрес к ответу, вместо использования настраиваемого заголовка? – SB2055

+0

Нет, для этого я не согласен, поэтому я пошел с настраиваемым заголовком, поскольку это казалось подходящим. –

+0

Можно отправить другой флаг с сервера, а затем на него можно перенаправить URL-адрес на стороне клиента. что не так с ним, а не с настройками заголовка ответа. –

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