Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 44
1

HttpWebRequest возвращает 401 ошибку

07.01.2015, 21:25. Просмотров 4140. Ответов 8
Метки нет (Все метки)

Здравствуйте. Имеется небольшая функция, которая отправляет GET запрос и получает ответ. Если все данные заполнены верно, то все хорошо, но если человек ошибся в логине или пароле, вместо ошибке о неверных логине или пароле, запрос возвращает 401 ошибку. (Проблема собственно в том что если перейти в браузере по этому пути, то вернется ошибка о неверном логине или пароле). Облазил весь интернет, перепробовал другие варианты отправки запроса - все одинаково. Подскажите что не так в коде, чего не хватает?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var req = (HttpWebRequest)WebRequest.Create("https://oauth.vk.com/token?grant_type=password&client_id=2274003&client_secret=hHbZxrka2uZ6jB1inYsH&username=USERNAME&password=PASSWORD&captcha_key=&captcha_sid=");
req.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36";
req.ContentType = "application/x-www-form-urlencoded";
 
try
{
    System.Net.WebResponse resp = req.GetResponse();
 
 
if (resp == null)
{
    MessageBox.Show("Error #1");
}
System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
MessageBox.Show(sr.ReadToEnd().Trim());
 
}
catch (System.Net.WebException en)
{
    MessageBox.Show(en.Message);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2015, 21:25
Ответы с готовыми решениями:

HTTPWebRequest.GetResponse() возвращает WebException
Здравствуйте. Возникла еще одна проблема у меня. Есть многопоточное приложение и такой метод: ...

HttpWebRequest любой запрос возвращает 403
WebRequest reqGET = (HttpWebRequest)WebRequest.Create("https://www.fl.ru/"); ...

WebRequest POST Удаленный сервер возвратил ошибку: (401) Несанкционированный
Здравствуйте. Вот такой запрос: string URI = @"https://oauth.vk.com/token"; string...

Как получить ответ сервера при 401 ошибке в классе httpwebrequest?
при попытке авторизоваться в вк через апи сервер может попросить ввести капчу, тогда он выдает 401...

8
828 / 636 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
07.01.2015, 23:21 2
Всё правильно, но из WebException'а можно достать не только сообщение об ошибке, но и отверт сервера, если он есть.
Не открывается ссылка через webbrowser для парсинга
0
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 44
08.01.2015, 00:51  [ТС] 3
Как можно достать ответ от сервера если ошибка гласит об отсутствии ответа?
0
828 / 636 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
08.01.2015, 01:39 4
Лучший ответ Сообщение было отмечено _Energetic_ как решение

Решение

Неправда. 401 - это уже код ответа, значит ответ есть.
Как достать - ты посмотрел ссылки? Просто я не могу по правилам дать ссылку на другой форум. Надо было добраться до этого кода:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Public Function DownloadPageContent(ByVal Url As String, Optional ByVal PageEncoding As Encoding = Nothing) As String
  Dim Data() As Byte, EncStr As String, Content As String, EncMatch As Match
 
  Using WC As New WebClient
    Try
      Data = WC.DownloadData(Url)
      EncStr = WC.ResponseHeaders(HttpResponseHeader.ContentType)
    Catch ex As WebException
      If ex.Response Is Nothing Then Throw
      Using Response As WebResponse = ex.Response
        EncStr = Response.Headers(HttpResponseHeader.ContentType)
        Using Stream As Stream = Response.GetResponseStream()
          Using Reader As New BinaryReader(Stream)
            Data = Reader.ReadBytes(Stream.Length)
          End Using
        End Using
      End Using
    End Try
  End Using
 
  If PageEncoding IsNot Nothing Then Return PageEncoding.GetChars(Data)
 
  Content = RemoveHtmlComments(Encoding.ASCII.GetChars(Data))
  EncMatch = Regex.Match(Content, "<meta\s+[^>]*?charset\s*=\s*[""']?([-\w]+)", RegexOptions.IgnoreCase Or RegexOptions.Singleline)
 
  If EncMatch.Success Then
    EncStr = EncMatch.Groups(1).Value
  ElseIf EncStr IsNot Nothing Then
    EncMatch = Regex.Match(EncStr, "charset\s*=\s*([^,;\s]+)", RegexOptions.IgnoreCase)
    EncStr = If(EncMatch.Success, EncMatch.Groups(1).Value, Nothing)
  End If
 
  Return Encoding.GetEncoding(If(EncStr, "UTF-8")).GetChars(Data)
End Function
В твоём случае проще - кодировка известна сразу.
1
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 44
09.01.2015, 21:03  [ТС] 5
Потрясающе! И правда все работает!
А вы не находили подобного аналога на C#?)
0
828 / 636 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
09.01.2015, 21:19 6
Во-первых, я его не находил, а написал. Во-вторых, по тем ссылкам ещё уйма полезной информации. И наконец, а в чём проблема сделать так же на шарпе?
0
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 44
09.01.2015, 21:38  [ТС] 7
Хотя уже все. Конвертер онлайн и гугл помогли
Для таких же как я, вот итоговый код

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public string DownloadPageContent(string Url)
        {
            byte[] Data;
            using (WebClient WC = new WebClient())
            {
                try
                {
                    Data = WC.DownloadData(Url);
                }
                catch (WebException ex)
                {
                    if (ex.Response == null)
                        throw;
                    using (WebResponse Response = ex.Response)
                    {
                        using (Stream Stream = Response.GetResponseStream())
                        {
                            using (BinaryReader Reader = new BinaryReader(Stream))
                            {
                                Data = Reader.ReadBytes((int)Stream.Length);
                                
                            }
                        }
                    }
                }
            }
            return System.Text.Encoding.UTF8.GetString(Data);
        }
Большое спасибо Qwerity за помощь!
0
828 / 636 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
09.01.2015, 21:45 8
У WebClient'а есть метод для получения сразу строки - в этом коде он не использовался, поскольку была неизвестна кодировка, в твоём случае можно воспользоваться им. Другой вариант, использовать HttpWebRequest и одинаково обрабатывать ответ, извлечённый из запроса, либо из исключения.

Почему ты не хочешь прочитать подробное описание?
0
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 44
09.01.2015, 21:56  [ТС] 9
WC.DownloadString, в курсе и его я использовал но все также безуспешно. Я использовал кучу всяких кодов, скачивал разные исходники тех же парсеров - но результат везде одинаковый. А твой код реально работает! Я обязательно поработаю над кодом но я уже счастлив, что все-таки это можно сделать на C#
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2015, 21:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Удаленный сервер возвратил ошибку 502 при использовании HttpWebRequest
Вдруг начал получать данную ошибку при использовании HttpWebRequest Сам код request =...

Ошибка в vknet: "Удаленный сервер возвратил ошибку: (401) Несанкционированный."
Здравствуйте. У меня такая проблема. У меня есть код для авторизации вконтакте. int appID =...

Удаленный сервер возвратил ошибку: (401) Несанкционированный
Добрый день! Странная особенность у программы началась. Делаю я прямую авторизация по логину/паролю...

$.get() возвращает ошибку
Здравствуйте! Не могу понять почему данный код не получает текст страницыvar html =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.