gpt4 book ai didi

c# - Web 请求/上传在最后失败

转载 作者:太空狗 更新时间:2023-10-29 17:36:17 24 4
gpt4 key购买 nike

我发现我的 HTTPWebRequest 上传在上传的最后失败了...如 this video @Screenr 所示

我的代码如下

using (var reqStream = req.GetRequestStream())
{
BinaryWriter reqWriter = new BinaryWriter(reqStream);
byte[] buffer = new byte[25600]; // 20KB Buffer
int read = 0, bytesRead = 0;
while ((read = memStream.Read(buffer, 0, buffer.Length)) > 0) {
reqWriter.Write(buffer); // at the very last loop, this line causes the error
bytesRead += read;
Debug.WriteLine("Percent Done: " + ((double)bytesRead / memStream.Length * 100) + "% " + DateTime.Now);
}

我不知道你是否需要更多代码,我只是不想在这里乱发代码。下面的异常

System.Net.WebException was caught
Message=The request was aborted: The request was canceled.
Source=System
StackTrace:
at System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting)
at System.Net.ConnectStream.System.Net.ICloseEx.CloseEx(CloseExState closeState)
at System.Net.ConnectStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()
at System.IO.Stream.Dispose()
at QuickImageUpload.ViewModels.ShellViewModel.UploadImage(String filename, String contentType, Byte[] image) in D:\Projects\QuickImageUpload\QuickImageUpload\ViewModels\ShellViewModel.cs:line 190
InnerException: System.IO.IOException
Message=Cannot close stream until all bytes are written.
Source=System
StackTrace:
at System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting)
InnerException:

注意内部异常“在写入所有字节之前无法关闭流。”。但是我没有关闭此循环中的任何流,对吗?

最佳答案

好吧,您通过将流放在 using 语句中来关闭它 - 但您应该关闭它,所以这不太可能成为问题。

开始的几点:

  • 我不会在这里使用 BinaryWriter。它不会给你买任何东西。直接写入流。
  • 如果memStream是一个MemoryStream,你可以使用WriteTo:

    using (var reqStream = req.GetRequestStream())
    {
    memStream.WriteTo(reqStream);
    }

    这意味着您不会得到诊断,但它确实使代码更简单:)

现在,至于发生了什么......我的猜测是你在调用 Write 时遇到异常,但该异常正在被有效替换通过关闭流抛出异常。

我也知道为什么会抛出异常...

您是否在任何地方设置内容长度?因为你可能正在考虑它。看看这一行:

reqWriter.Write(buffer);

这是在循环的每次 迭代时写出整个缓冲区,忽略您刚刚读取的数据量。您已经将读取的字节数分配给变量 read,但是您永远不会使用该值。您可以通过将其更改为来解决此问题

reqWriter.Write(buffer, 0, read);

...但我个人不会。我或者只使用MemoryStream.WriteTo 或者直接写入请求流...正如我之前所说,BinaryWriter 实际上并没有给你买任何东西。

无论如何,在您当前的代码中,无论您的内容长度如何,您都会尝试为每个请求写入 25600 字节的倍数。如果请求流注意到这一点并抛出异常,我不会感到惊讶。假设我们有 30000 字节的数据。我怀疑序列是这样的:

  • 内容长度设置为30000
  • 获取流并进入using语句
  • 从内存流中读取 25600 字节
  • 写出 25600 字节:stream 验证这是正确的
  • 从内存流中读取 4400 字节(即所有剩余数据)
  • 尝试写入 25600 字节:流 立即 确定无效,并抛出 IOException
  • 然后 using 语句的隐式 finally block 处理流,关闭它
  • 流注意到只有 25600 字节被成功写入,这还不够,所以抛出异常

正是这种事情让库从 Dispose 中抛出异常成为一个坏主意......但假设我是对的,它确实会给出你同时尝试过的有趣问题写入太多太少的数据:)

关于c# - Web 请求/上传在最后失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4237071/

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