c# – Web Request / Upload Failing at Very End

前端之家收集整理的这篇文章主要介绍了c# – Web Request / Upload Failing at Very End前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发现我的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,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语句中 – 但是你应该关闭它,所以这不太可能是问题.

几点要开始:

>我不会在这里使用二进制文件.这不是你买的东西直接写入流.
>如果memStream是MemoryStream,可以使用WriteTo:

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

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

现在,关于发生了什么…我的猜测是,在调用Write方面你会得到一个例外,但这个异常正在被关闭流引起的异常所替代.

我有一个想法为什么可能会抛出异常?

您是否在任何地方设置内容长度?因为你可能已经过去了看这条线:

reqWriter.Write(buffer);

这是在循环的每次迭代中写入整个缓冲区,忽略您刚刚读取的数据量.您已经将读取的字节数分配给读取的变量,但是您从不使用该值.您可以通过将其更改为

reqWriter.Write(buffer,read);

…但我个人不会.我会使用MemoryStream.WriteTo或直接写入请求流…如前所述,BinaryWriter实际上并不买你什么.

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

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

这是这样的事情,这使得它不利于从Dispose …抛出异常,但假设我是对的,它确实提供了一个有趣的问题,你同时试图写太多太少的数据:)

猜你在找的C#相关文章