gpt4 book ai didi

c# - 发送大文件/内容时 HttpClient 是否存在缺陷?

转载 作者:行者123 更新时间:2023-11-30 12:44:43 25 4
gpt4 key购买 nike

在阅读/谷歌搜索 HttpClient 后,我​​的印象是该组件不适合将大文件或内容上传到 REST 服务。

  1. 似乎如果上传时间超过设定的超时时间,传输就会失败。是否有意义?这个超时是什么意思?

  2. 获取进度信息似乎很难或需要附加组件。

所以我的问题是:是否可以轻松解决这两个问题?否则,处理大型内容和 REST 服务时最好的方法是什么?

最佳答案

  1. 是的,如果上传时间超过超时时间,上传将失败。这是 HttpClient 的限制。解决此问题的最可靠解决方案是 Thomas Levesquewritten an article about ,并在他的评论中链接到您的问题。您必须使用 HttpWebRequest 而不是 HttpClient
  2. 如果您想获取进度消息,请将文件作为 FileStream 打开并手动遍历它,以增量方式将字节复制到(上传)请求流中。在进行过程中,您可以计算相对于文件大小的进度。

TL 的代码示例。 Be sure to read the article though! :

long UploadFile(string path, string url, string contentType)
{
// Build request
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = WebRequestMethods.Http.Post;
request.AllowWriteStreamBuffering = false;
request.ContentType = contentType;
string fileName = Path.GetFileName(path);
request.Headers["Content-Disposition"] = string.Format("attachment; filename=\"{0}\"", fileName);

try
{
// Open source file
using (var fileStream = File.OpenRead(path))
{
// Set content length based on source file length
request.ContentLength = fileStream.Length;

// Get the request stream with the default timeout
using (var requestStream = request.GetRequestStreamWithTimeout())
{
// Upload the file with no timeout
fileStream.CopyTo(requestStream);
}
}

// Get response with the default timeout, and parse the response body
using (var response = request.GetResponseWithTimeout())
using (var responseStream = response.GetResponseStream())
using (var reader = new StreamReader(responseStream))
{
string json = reader.ReadToEnd();
var j = JObject.Parse(json);
return j.Value<long>("Id");
}
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.Timeout)
{
LogError(ex, "Timeout while uploading '{0}'", fileName);
}
else
{
LogError(ex, "Error while uploading '{0}'", fileName);
}
throw;
}
}

关于c# - 发送大文件/内容时 HttpClient 是否存在缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27595437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com