У меня есть довольно тривиальный случай, когда я хочу загрузить файл в службу под названием CloudConvert.com
Для этого я использую многочастную форму, есть даже пример того, как использовать многочастные формы изhtml на их консоли API:
Это их пример:
<form action="https://api.cloudconvert.com/convert" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<input type="hidden" name="apikey" value="banana-my-key">
<input type="hidden" name="inputformat" value="pdf">
<input type="hidden" name="outputformat" value="docx">
<input type="hidden" name="input" value="upload">
<input type="hidden" name="wait" value="true">
<input type="hidden" name="download" value="inline">
<input type="submit" value="Convert!">
</form>
Это мой соответствующий код c #:
using (var client = new HttpClient())
using (var formData = new MultipartFormDataContent())
{
formData.Add(new StreamContent(paramFileStream), "file" );
formData.Add(new StringContent("banana-my-key"), "apikey" );
formData.Add(new StringContent("pdf"), "inputformat" );
formData.Add(new StringContent("docx"), "outputformat" );
formData.Add(new StringContent("upload"), "input");
formData.Add(new StringContent("true"), "wait");
formData.Add(new StringContent("inline"), "download");
var response = await client.PostAsync("https://api.cloudconvert.com/convert", formData,new CancellationTokenSource(TimeSpan.FromSeconds(2000)).Token);
if (!response.IsSuccessStatusCode)
{
return null;
}
return await response.Content.ReadAsStreamAsync();
}
Этот код завершается ошибкой, за исключением:
System.Threading.Tasks.TaskCanceledException: The operation was canceled. ---> System.IO.IOException: Unable to read data from the transport connection: Operation canceled. ---> System.Net.Sockets.SocketException: Operation canceled
--- End of inner exception stack trace ---
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error)
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.GetResult(Int16 token)
at System.Net.Security.SslStreamInternal.<FillBufferAsync>g__InternalFillBufferAsync|38_0[TReadAdapter](TReadAdapter adap, ValueTask`1 task, Int32 min, Int32 initial)
at System.Net.Security.SslStreamInternal.ReadAsyncInternal[TReadAdapter](TReadAdapter adapter, Memory`1 buffer)
at System.Net.Http.HttpConnection
Внутри Cloudconvert я вижу, что они сообщают, что ожидают загрузки.
Что я здесь не так делаю, похоже, что StreamContent не передается в запросе так, как должно быть.
Здесь есть какие-либо очевидные проблемы?
ps.Поместить их пример HTML в файл HTML и загрузить его таким образом работает нормально.