2017-02-23 59 views
2

Я пытаюсь разобрать страницу wikispaces, но я не могу получить фактическую страницу. Я не уверен, что это ошибка HttpClient или некоторая отсутствующая конфигурация.HttpClient не перенаправляет, даже если AllowAutoRedirect = true

Это мой код:

HttpClientHandler handler = new HttpClientHandler(); 
handler.AllowAutoRedirect = true; 
_httpClient = new HttpClient(handler); 

HttpResponseMessage response = await _httpClient 
    .GetAsync("http://medivia.wikispaces.com/Monsters"); 

Когда я запускаю этот код я получаю StatusCode 302 и отправляют в https://session.wikispaces.com/1/auth/auth?authToken=token. Я ожидаю, что HttpClient будет следовать за 302, потому что у меня есть AllowAutoRedirect = true.

Это первый раз, когда я столкнулся с этой проблемой. Он отлично работает с Postman и RestClient, который является частью RestSharp.

+0

Почему бы не использовать 'WebClient'? –

+1

Я не уверен, понял ли я это, но если вы не хотите следовать перенаправлению, вы можете просто установить '' 'handler.AllowAutoRedirect = false;' '' – giubueno

+0

@LeiYang Поскольку 'WebClient' является старым, ужасным и нуждается в умереть, отвратительная, мучительная смерть! – DavidG

ответ

3

Причина, по которой HttpClient не перенаправляется должным образом, связана с тем, что сайт перенаправляет вас на HTTPS, а затем обратно в HTTP. Быстрое исправление ПОЛУЧИТЬ https://medivia.wikispaces.com/Monsters вместо этого, что является лучшей идеей, так или иначе:

HttpResponseMessage response = await _httpClient.GetAsync("https://medivia.wikispaces.com/Monsters"); 
// Works fine! :) 

мне было интересно, почему он не работает первый способ, так что я выкопал немного глубже. Если вы посмотрите трассировку сети в браузере или клиент сети, это то, что происходит:

GET http://medivia.wikispaces.com/Monsters 
302 https://session.wikispaces.com/1/auth/auth?authToken=token 
302 http://medivia.wikispaces.com/Monsters?redirectToken=token 

Это 302 из зашифрованного (HTTPS) соединение с незашифрованном один вызывает HttpClientHandler для автоматической остановки после. Из того, что я могу сказать, это причуда безопасности Windows implementation of HttpClientHandler, потому что Unix one, похоже, не беспокоился о перенаправлении HTTPS-> HTTP в моем неформальном тестировании.

+0

славный не знал, что было даже спасибо! – Diego