powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
14 сообщений из 14, страница 1 из 1
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015716
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь отправить RestAPI запрос с помощью (HttpWebResponse)_request.GetResponse(); и получаю ошибки доступа.

Создаю два абсолютно одинаковых приложения . Console (Core 3.1) и Windows Froms (.NET 4.5).
Т.е. консольном из функции main() и во втором из функции Form1_Load() запускается одна и та же функция.

Но в первом случае работает идеально, а во втором - постоянно какие-то ошибки доступа на сайт.

Сначала выдавалась "Аутентификация не пройдена из-за закрытия транспортного потока"

Добавил строку
Код: c#
1.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11;


в самом начале - и авторизацию пройти удалось. Обе программы стали отрабатывать гладко.
Но "авторизация" - это получение куки в сотню символов.

Далее пытаюсь эту куки отправить снова на сайт вместе с запросом данных - "удаленный сервер возвратил ошибку 401 несанкционированный" .
Но только в winforms(!)
В консоле работает чётко(!!)

Вот эта программулина:
Код: 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.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11;

//ServicePointManager
//    .ServerCertificateValidationCallback +=
//    (sender, cert, chain, sslPolicyErrors) => true;
HttpWebRequest _request = (HttpWebRequest)HttpWebRequest.Create("https://example.com/api/people");

_request.Method = "POST";
//у меня есть прокси
_request.Proxy = new WebProxy("proxyservername", true);
_request.Proxy.Credentials = new System.Net.NetworkCredential("proxyusername@mycompany.com", "67$ff34password");

//отправляю json, это ж ведь POST запрос
_request.ContentType = "application/json";
_request.ContentLength = "2";
StreamWriter _streamWriter = new StreamWriter(_request.GetRequestStream());
_streamWriter.Write("[]"); //какой-то контент, не важно. Но что-то передаю
_streamWriter.Close();

//отправляю куки, в нём содержится инфа об авторизации. Эта куки успешно получена от предыдущего запроса
_request.CookieContainer = new CookieContainer();
_request.CookieContainer.Add(
                    new Cookie(".ASPXAUTH"
                    , "52362C87F..........9F5DE539A7AD007AC2" //информация об авторизации. Если её не передать, будет 401
                    , "/", "app.example.com"))

HttpWebResponse _response = (HttpWebResponse)_request.GetResponse();


Как так?
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015718
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p.s. я по началу мне казалось, что проблема в SQL Server, в связи с чем была создана вот эта тема. Там мне помогли пройти этап авторизации.
Но поскольку стало ясно, что стоит экспериментировать не с сервером, а просто в пределах двух приложений, то продолжение обсуждения выношу сюда, обе темы связываю между собой ссылками. Ведь это касается только C# и .NET, а не сервера.
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015737
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя домен запроса и домен куки не совпадают - может дело в этом?
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015747
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин..
уточню

Код: c#
1.
2.
3.
4.
5.
6.
HttpWebRequest _request = (HttpWebRequest)HttpWebRequest.Create("https://app.example.com/api/people");
...
_request.CookieContainer.Add(
                    new Cookie(".ASPXAUTH"
                    , "52362C87F..........9F5DE539A7AD007AC2" //информация об авторизации. Если её не передать, будет 401
                    , "/", "app.example.com"))



В консоли работает, в WinForms нет)
Я пытаюсь чем-нибудь просмотреть, как выглядит в итоге HTTP запрос, который отправляется на сервер, например, fiddler'ом, но он там сложности с установкой сертификата, никак не могу заставить всех ему верить. Но это другая тема, в общем.
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015757
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nika gnome
В консоли работает, в WinForms нет)
Скорее всего дело не в Консоли или WF, а в Core и FW4.5

Можно для эксперимента сделать консольное приложение на FW4.5 и проверить

А вообще, может пользоваться HttpClient-ом, чтобы со всеми этими куками не возиться?
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015760
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nika gnome
Я пытаюсь чем-нибудь просмотреть, как выглядит в итоге HTTP запрос, который отправляется на сервер, например, fiddler'ом, но он там сложности с установкой сертификата, никак не могу заставить всех ему верить. Но это другая тема, в общем.

Там по-моему легко все это включается - он при запросе сам предлагает это настроить, если не настроено. Давно просто им не пользовался (для моих целей хватает DevTools браузера), и у меня его сейчас нет, а то бы посмотрел.

Судя по "401 Unauthorized" сервер по какой-то причине либо вообще не получает куку, либо её не понимает, иначе было бы "403 Forbidden" (если сервер кошерный). Так что я бы изначально копал в этом направлении и как-нибудь оттрейсил что же там реально в HTTP передается.
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015765
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Скорее всего дело не в Консоли или WF, а в Core и FW4.5

именно так и есть. Понять не могу, как это побороть.
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015819
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
А вообще, может пользоваться HttpClient-ом, чтобы со всеми этими куками не возиться?

HttpClient сам-то тоже куку не отправит. Но, по любому, конечно, HttpWebRequest это легаси:
https://docs.microsoft.com/en-us/dotnet/api/system.net.httpwebrequest?view=net-5.0 Important

We don't recommend that you use HttpWebRequest for new development. Instead, use the System.Net.Http.HttpClient class.
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015822
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В порядке мозгового штурма. Попробуй куку добавить не через контейнер, а прямо в Headers .
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015854
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
HttpClient сам-то тоже куку не отправит.
разве? Там вроде, пока ты экземпляр не убил, он сохраняет состояние с куками, сам принимает, сам отправляет. Правда, не уверен на 100%, ща некогда проверить, но по-моему в этом и удобство этого клиента.
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015858
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй WinForm на Core перенести.
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015874
Ferdipux
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
Попробуй WinForm на Core перенести.

ТС это нужно, чтобы запускать в качестве task в SSIS. А там только FW4.5. Собственно, вопрос - как заставить функциональность работать на FW4.5.
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015890
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
fkthat
HttpClient сам-то тоже куку не отправит.
разве? Там вроде, пока ты экземпляр не убил, он сохраняет состояние с куками, сам принимает, сам отправляет. Правда, не уверен на 100%, ща некогда проверить, но по-моему в этом и удобство этого клиента.

Да, сейчас в инете полистал - и правдв сохраняет, если UseCookie = true (оно так по умолчанию). Я и не знал :))
...
Рейтинг: 0 / 0
Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
    #40015891
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ferdipux
ТС это нужно, чтобы запускать в качестве task в SSIS. А там только FW4.5. Собственно, вопрос - как заставить функциональность работать на FW4.5.

Он, как раз, начиная с 4.5 и появился:
https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.5
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Два приложения: консольное и winforms. Из одного отправляется restapi, из другого нет
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]