Windows UWP c # HttpClient POST и прогресс

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

Рабочий код:

const uint streamLength = 100000;
HttpStreamContent streamContent = new HttpStreamContent(new SlowInputStream(streamLength));
IProgress<HttpProgress> progress = new Progress<HttpProgress>(ProgressHandler);
response = await httpClient.PostAsync(new Uri(settings.url + "/script.php"), streamContent).AsTask(cts.Token, progress);

Это дает мне прогресс и все, теперь мне нужно добавить 4 значения поста, прежде чем они были в словаре следующим образом:

var values = new Dictionary<string, string>
{
{ "1", "1" },
{ "2", "2" },
{ "3", "3" },
{ "4", "4" }
};

Затем я закодировал их

HttpFormUrlEncodedContent formContent = new HttpFormUrlEncodedContent(values);

Как я получу свой formContent (или если вы хотите сделать это другим способом, который тоже работает) в streamContent, потому что без streamContent выглядит так, что прогресс не работает.

Изменить 1:

Итак, это работает, теперь прогресс больше не работает. Вот моя функция прогресса

private void ProgressHandler(HttpProgress progress)
{
Debug.WriteLine("Stage: " + progress.Stage.ToString());
Debug.WriteLine("Retires: " + progress.Retries.ToString(CultureInfo.InvariantCulture));
Debug.WriteLine("Bytes Sent: " + progress.BytesSent.ToString(CultureInfo.InvariantCulture));
Debug.WriteLine("Bytes Received: " + progress.BytesReceived.ToString(CultureInfo.InvariantCulture));

ulong totalBytesToSend = 0;
if (progress.TotalBytesToSend.HasValue)
{
totalBytesToSend = progress.TotalBytesToSend.Value;
Debug.WriteLine("Total Bytes To Send: " + totalBytesToSend.ToString(CultureInfo.InvariantCulture));
}
else
{
Debug.WriteLine("Total Bytes To Send: " + "unknown");
}

ulong totalBytesToReceive = 0;
if (progress.TotalBytesToReceive.HasValue)
{
totalBytesToReceive = progress.TotalBytesToReceive.Value;
Debug.WriteLine("Total Bytes To Receive: " + totalBytesToReceive.ToString(CultureInfo.InvariantCulture));
}
else
{
Debug.WriteLine("Total Bytes To Receive: " + "unknown");
}

double requestProgress = 0;
if (progress.Stage == HttpProgressStage.SendingContent && totalBytesToSend > 0)
{
requestProgress = progress.BytesSent * 50 / totalBytesToSend;
}
else if (progress.Stage == HttpProgressStage.ReceivingContent)
{
// Start with 50 percent, request content was already sent.
requestProgress += 50;

if (totalBytesToReceive > 0)
{
requestProgress += progress.BytesReceived * 50 / totalBytesToReceive;
}
}
else
{
return;
}
Debug.WriteLine("Progress: " + requestProgress);
snap_progress.Value = requestProgress;
}

И вот что он показывает в отладке:

Stage: ReceivingContent
Retires: 0
Bytes Sent: 180
Bytes Received: 6757607
Total Bytes To Send: 180
Total Bytes To Receive: unknown
Progress: 50

Это неизвестно все время, хотя я вижу увеличение числа полученных байтов.

0

Решение

Так что мой ответ почти нулевой, мне просто нужно было указать Content-Length в моем php-скрипте, чтобы код получал размер, он отображал неизвестное значение. Я до сих пор не знаю, как он получил это раньше.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]