代码之家  ›  专栏  ›  技术社区  ›  Roger Johansson

HttpClient PostAsync取消请求

  •  0
  • Roger Johansson  · 技术社区  · 6 年前

    我有一个非常小的例子,我想上传一个文件到一个名为CloudConvert.com

    我使用多部分表单来实现这一点,甚至有一个示例说明如何在API控制台上使用html中的多部分表单:

    这是他们的例子:

    <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并没有以应有的方式在请求中进行流式传输。

    有什么明显的问题吗?

    另外,把他们的html例子放进一个html文件,然后用这种方式上传就可以了。

    0 回复  |  直到 6 年前