gpt4 book ai didi

c# - HttpClient 通过 PostAsync 上传文件的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-03 21:35:03 42 4
gpt4 key购买 nike

我希望有人对此有一个解释,因为它让我抓狂。

我在 WinForms 应用程序中有以下代码,用于使用 HttpClient 将文件上传到 Web API 服务。

ProgressMessageHandler progressMsgHandler = new ProgressMessageHandler();
progressMsgHandler.HttpSendProgress += (s, e) =>
{
this.InvokeIfNeeded(() =>
{
// LOG
this.AddLogLine("Progress: " + e.ProgressPercentage.ToString());
});
};

using (var client = HttpClientFactory.Create(progressMsgHandler))
{
using (var content = new MultipartFormDataContent())
{
var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
var streamContent = new StreamContent(stream);
content.Add(streamContent);

var url = String.Format("{0}?src={1}", STR_URL_FILEMGMT, "IM");
client.PostAsync(new Uri(url), content).ContinueWith(task =>
{
if (task.Result.IsSuccessStatusCode)
{
this.InvokeIfNeeded(() =>
{
// LOG
this.AddLogLine("File has been uploaded OK!");
});
}
else
this.InvokeIfNeeded(() =>
{
// LOG
this.AddLogLine(String.Format("Error during upload: '{0}'", task.Exception.Message));
});
});
}
}

请注意,列出的整个代码也包含在一个 try catch 中,如果有异常,将在该处打印。

对我来说很奇怪的是我根本没有打印任何日志行。既不是为了进步,也不是为了成功发布,既不是为了发布错误,也不是在全局 try catch 中。

在调试过程中,我看到代码正在执行,但没有在日志行所在的位置设置任何断点。

可能我没有正确使用 HttpClient 或这些任务(顺便说一句,我是初学者)?有谁知道我的代码出了什么问题?


更新(从 Noseratio 获得解决方案后):

可以找到帮助我理解 HttpClient 不需要处理的额外信息 here

最佳答案

在您的代码中,client.PostAsync 立即返回(同时操作在后台继续)。这会展开您的两个 using 语句,因此 HttpClient 对象在上传完成之前被处理掉。

如果你想在这里使用using,你需要使用await而不是ContinueWith:

var result = await client.PostAsync(...);
if (result.IsSuccessStatusCode)
{
// ...
}

如果您需要面向 .NET 4.0 但使用 VS2012+ 进行开发,您仍然可以使用 async/await,Microsoft 提供了 Microsoft.Bcl.Async图书馆。

关于c# - HttpClient 通过 PostAsync 上传文件的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22211401/

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