V.Lorz Ответов: 1

C# эквивалентен Python requests.session()


Привет,
У меня есть код на Python для доступа к веб-серверу, который требует аутентификации перед доступом к другим ресурсам. Но мне нужно сделать это на C#. Есть ли вокруг какой-нибудь пример C#, работающий аналогично библиотеке запросов Python request?

Заранее большое спасибо.

Код Python аналогичен приведенному ниже:
mySession = requests.Session()
url = 'https://some_plce/login'
login_info = { "who": "me", "pwd": "don't give it"}
mySession.post(url, login_info)

ans = mySession.get(
  "https://some_plce/data",
  params={
    'param1': __some_param1,
    'param2': __some_param2
  })

my_precious_data = ans.content.decode('utf8').replace("'", '"')


Что я уже пробовал:

Я уже смог выполнить шаг входа в систему (с помощью POST), используя приведенный ниже код, но мне нужно получить данные.

string Uri = "https://some_plce/login";
string POSTData = $"who={Usr}&pwd={pwd}"; // Usr & Pwd are function parameters.
byte[] rawPOSTData = Encoding.UTF8.GetBytes( POSTData );

WebRequest request = WebRequest.Create( Uri );
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = rawPOSTData.Length;

using (Stream dataStream = request.GetRequestStream())
{
    dataStream.Write( rawPOSTData, 0, rawPOSTData.Length );
    dataStream.Close();
}

using (WebResponse response = request.GetResponse())
{
    // Do some checks.
}

F-ES Sitecore

Измените "POST" на "GET" в методе и поместите параметр в параметр POSTData на URL-адресе. Если вы загуглите, как сделать GET с помощью WebRequest, вы найдете примеры.

V.Lorz

Привет F-ES Sitecore, спасибо за ваш комментарий.
Первый запрос (логин) требует POST, а не GET. А для второго требуется идентификатор сеанса, возвращаемый сервером при первом запросе входа в систему. Может быть, мой вопрос не был самоочевидным, извините за это.
Я уже решил эту проблему, смотрите мой комментарий ниже под решением MadMyche.

1 Ответов

Рейтинг:
6

MadMyche

Сеанс на самом деле является элементом на стороне сервера, и то, как он отслеживается, осуществляется с помощью файлов cookie. В среде C# вы бы прикрепили a CookieContainer на запрос сообщить серверу, что вы принимаете файлы cookie

var request = (HttpWebRequest)WebRequest.Create(uri);
request.CookieContainer = new CookieContainer();
И тогда, когда вы получите ответ, будет Cookies свойство, которое будет представлять собой коллекцию всех файлов cookie, которые были отправлены.
var response = (HttpWebResponse) request.GetResponse()
Сохраните файлы cookie и добавьте их обратно, когда будете делать последующие запросы

Рекомендации:
класс HttpWebRequest.Свойство CookieContainer (System.Net) | Microsoft Docs[^]
Класс httpwebresponse.Свойство Cookies (System.Net) | Microsoft Docs[^]


V.Lorz

Большое спасибо, что нашли время ответить, @MadMyche. Вот то, что я делал, и работало на меня:

CookieContainer Cookies = новый CookieContainer();
Cookies.Добавить( новый файл "cookie" ( "thesessionidcookiename", код сеанса, "", "домен сервера " ) );

HttpWebRequest request = HttpWebRequest.CreateHttp( $"{Uri}?{POSTData}" );
запрос.метод get";
запрос.CookieContainer = Файлы Cookie;

использование (WebResponse response = request.GetResponse())
{}

В конце концов сервер использует механизм сервлетов java, поэтому идентификатор сеанса также может быть задан как часть url-адреса. В ответе на вход в систему нет файла cookie идентификатора сеанса, как и вообще никакого файла cookie, он входит в состав его заголовков.