首页 > 解决方案 > c# HttpClient - 从传输流中接收到意外的 EOF 或 0 字节

问题描述

我通过使用HttpClient并行下载5个文件从.net core 3.1应用程序连接到服务器,但是当我通过该方法发送http请求SendAsync并尝试读取服务器通过响应流发出的字节时,我得到以下例外:

从传输流接收到意外的 EOF 或 0 字节

以下代码用于发送 Http 请求消息以下载文件:

// Send DownloadRequest
public async Task RequestDownload(string fileid, string tokenauth, CancellationToken cancellationToken = default)
{
    // create request message
    var request = GetRequest(fileid, tokenauth);

    // create createhttpclient
    HttpClient _client = HttpClientFactory.CreateHttpClient();

    // send request
    var response = await _client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);

    // get response stream
    using (var responsestream = await response.Content.ReadAsStreamAsync())
    {
        using(Stream copystream = new FileStream(fileid, FileMode.Create, FileAccess.Write, FileShare.Write))
        {
            responsestream.CopyTo(copystream);
        }
    }

    var ausresult = await ParseDownloadResponse(response);
}

构建方法HttpRequestMessage

// Create httpRequestMessage
public static HttpRequestMessage GetRequest(string fileid, string authorizationtoken)
{
    // Build uri connection
    var uri = new System.Uri("https://www.downloadserver.com/GetFile");

    var strfieldid = "{\"fileId\":\"" + fileId + "\"}";
    var body = Encoding.UTF8.GetBytes(strfieldid);
    var request = new HttpRequestMessage()
                      {
                          Method = HttpMethod.Post,
                          RequestUri = uri,
                          Content = new ByteArrayContent(body)
                      };

    request.Headers.TryAddWithoutValidation("Authorization", authorizationtoken);

    return request;
}

HttpClient对象为每个下载请求重用 (5),因此HttpClient并行使用相同的实例,除了 http 客户端被初始化如下HttpClientHandler

创建方法HttpClient

// Get HttpClient
public static HttpClient CreateHttpClient(int timeout)
{
    if (_client == null)
    {
        // create http handler to allow Auto Redirect
        var handler = new HttpClientHandler()
                          {
                              AllowAutoRedirect = true,
                              UseProxy = false
                          };
        // create httpclient
        _client = new HttpClient(handler);

        _client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);

        _client.DefaultRequestHeaders.Accept.Clear();
        _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }

    return _client;
}

最后当我下载单个文件时,没有产生异常,下载成功完成,但是当所有5个文件同时并行下载时,出现异常Received an unexpected EOF or 0 bytes from the transport stream。

任何想法将不胜感激。

最好的

标签: c#.netasp.net-core.net-core

解决方案


推荐阅读