System.ObjectDisposedException: 'Cannot access a closed Stream.' при отправке Post запроса
Накидал я небольшую программу в консоли, отправляющую 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();
Увы тоже не помогло. В итоге, так и не сумев решить проблему самостоятельно пишу вам, господа. За ранее спасибо.
Ответы (1 шт):
Как-то так должно быть, если ничего в логике не менять
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. У вас ничего не получится, там капча защищает сайт.