首页 > 解决方案 > 处理多个大文件时来自 HTTP 客户端的套接字异常

问题描述

我的代码在启动时创建了一个 HTTP 客户端,该客户端在应用程序的整个生命周期中都使用。它按顺序处理文件,从存储帐户流式传输内容,并通过 HTTP 请求将其发送到外部服务进行内容分析。然后它将分析的内容上传到另一个存储帐户。

这可以工作好几个小时,但突然在 httpClient.SendAsync 方法上遇到 System.Net.Sockets.SocketException。发生这种情况时,处理的每个后续文件也会因 System.Net.Sockets.SocketException 而失败。我发现只有在多个大文件排队等待处理时才会发生这种情况,这让我认为可能是某些资源没有正确处理。

我的问题是为什么会发生这种情况,我该如何从这种情况中恢复过来?

重新启动应用程序可以解决问题,直到引发另一个 System.Net.Sockets.SocketException,此时模式会继续(每个后续文件都会失败,直到重新启动应用程序)。

var multipartContent = new MultipartFormDataContent();

// blobStream is of type Stream and is passed into this method
using (var byteArrayContent = new ByteArrayContent(blobStream.CopyToBytes()))
{
    multipartContent.Add(byteArrayContent, Upload, Path.GetFileName($"{documentId}.{fileExtension}"));

    var request = new HttpRequestMessage(HttpMethod.Post, TikaForm) { Content = multipartContent };
    request.Headers.Add(Accept, TextPlain);

    var response = _httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead).ConfigureAwait(false).GetAwaiter().GetResult();

    var responseLength = response.Content.Headers.ContentLength.HasValue ? (int)response.Content.Headers.ContentLength.Value : -1;

    string text;

    using (var stream = response.Content.ReadAsStreamAsync().ConfigureAwait(false).GetAwaiter().GetResult())
    {
        byte[] dataBytes = new byte[responseLength];
        stream.Read(dataBytes, 0, responseLength);

        // Read text from byte array and trim the leading and trailing whitespace.
        text = Encoding.UTF8.GetString(dataBytes, 0, dataBytes.Length).Trim();

        using (var subStream = new MemoryStream(Encoding.UTF8.GetBytes(text)))
            _blobStorage.UploadBlob(targetPath, subStream).ConfigureAwait(false).GetAwaiter().GetResult();
    }
}

标签: .nethttpdotnet-httpclient

解决方案


推荐阅读