0

Накидал я небольшую программу в консоли, отправляющую Post запрос на сайт.

private static void Main()
{
    SendPostAsync();
}

static async void SendPostAsync() { HttpClient client = new HttpClient();

var body = new Dictionary<string, string>

{ {"login", "97328"}, {"pass", "97328"}, };

var content = new FormUrlEncodedContent(body);

content.Headers.Add("Cookie", new string[]
    {
    "PHPSESSID=jn81op7nnt8r29r4qfb4erhnu4",
    "secure=1"
    });

await client.PostAsync(@"https://chgu.org/", content);
await client.PostAsync(@"https://chgu.org/?role=136664", content);

var response = await client.GetAsync(@"https://chgu.org/user/friends");

}

Все работает отлично. Ошибок нет. Затем создал проект Xamarin, вставил туда этот же метод и вызвал его.

public App()
{
    InitializeComponent();
}

protected override void OnStart() { SendPostAsync(); }

И на те! System.ObjectDisposedException: 'Cannot access a closed Stream.' Немного погуглив выяснил что ошибка возникает при попытке обращения к "закрытому" потоку. Тут чувак написал использовать MemoryStream однако я так и не понял как его использовать в моем случае. Также пробовал использовать:

Thread thread = new Thread(SendPostAsync);
thread.Start();

Увы тоже не помогло. В итоге, так и не сумев решить проблему самостоятельно пишу вам, господа. За ранее спасибо.

CSEON
  • 69
  • А что этот код должен сделать то? Почему вы отправляете пост и не чистаете ответ? Что вы хотите получить из гета? Почему поста 2? – aepot Dec 09 '22 at 12:12
  • @aepot Пытался спарсить сайт с авторизацией. Первые 2 Post запроса служат для авторизации на сайте, чтобы тут: var response = await client.GetAsync(@"https://chgu.org/user/friends"); получить html и дальше работать с ним. – CSEON Dec 09 '22 at 16:35

1 Answers1

0

Как-то так должно быть, если ничего в логике не менять

private static async Task Main()
{
    try
    {
        await SendPostAsync();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

private static readonly HttpClientHandler handler = new HttpClientHandler(); private static readonly HttpClient client = new HttpClient(handler);

static async Task SendPostAsync() { // это запрос проинициализирует куки сайта, но вряд-ли это необходимо string mainPage = await client.GetAsync("https://chgu.org/");

var body = new Dictionary<string, string>
{
    {"login", "97328"},
    {"pass", "97328"},
};
var content = new FormUrlEncodedContent(body);

//PHPSESSID вам точно не нужна, она уже в контейнер легла сама после первого GET запроса.
//Для доступа к кукам используйте handler.CookieContainer

using (var response = await client.PostAsync("https://chgu.org/?role=136664", content))
{
    Console.WriteLine($"POST Result: {(int)response.StatusCode} {response.ReasonPhrase}");
    string postResult = await response.Content.ReadAsStringAsync();
    Console.WriteLine(postResult);
}

string html = await client.GetStringAsync(@"https://chgu.org/user/friends");

}

Работа с Cookie в HttpClient для парсинга с авторизацией

P.S. У вас ничего не получится, там капча защищает сайт.

aepot
  • 49,560