当服务器处于流模式时,需要帮助在C#客户端(HttpWebRequest)中传输大数据

时间:2015-09-10 12:34:10

标签: c# wcf streaming

我在挠头, - 我在将大数据上传到WCF服务器时遇到问题。 我看到一篇建议使用异步编程的帖子,因为它忽略了HTTPWebRequest超时。 我看到了几个问题:

  1. 在执行“GetRequestStream / GetRequestStreamAsync”时,服务器端没有任何操作,不会调用upload方法。
  2. 在流中执行Write / WriteAsync时,服务器端没有任何操作,不会调用upload方法
  3. 执行“GetResponse / GetResponseAsync”时 - 只有这样,才会启动上传方法。如果我关闭客户端应用程序,服务器仍会上传文件 - 这意味着,流式数据将写入不在客户端进程内的某个位置。
  4. 我尝试使用flush / without flush / async / sync - 没有解决问题。

    我做错了什么?如何从C#将大数据正确地流入服务器? 服务器是RESTful wcf,并配置为允许大数据流。

    异步代码是这样的:

                   HttpWebRequest request = RESTUtils.InitializeRequest(...);
                   request.SendChunked = true
                   request.AllowWriteStreamBuffering = false;
    
    
                   using (Stream requestStream = await request.GetRequestStreamAsync())
                   {
                      // We will write the stream to the request
                      byte[] buffer = new byte[UPLOAD_FILE_BUFFER_SIZE];
                      int read = await i_RequestStream.ReadAsync(buffer, 0, buffer.Length);
    
                      while (read > 0)
                      {
                         await requestStream.WriteAsync(buffer, 0, read, m_SessionCancellationToken); // nothing happens at server
                         await requestStream.FlushAsync();
                         m_SessionCancellationToken.ThrowIfCancellationRequested();
                         read = await i_RequestStream.ReadAsync(buffer, 0, buffer.Length);
                      }             
                   }
    
                   using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync()) // ONLY here the REST method starts
                   {
                      using (Stream responseStream = response.GetResponseStream())
                      {
                         actualResult = RESTUtils.StreamReadToEnd(responseStream);
                      }
                   }
    

    ==更新== 甚至更奇怪的事情发生了 - 我在写入之后立即设置了断点,等待了5分钟,只有这样,服务器得到了请求(即使客户端处于断点。 服务器没有等待客户端完成发送数据(关闭流) - 它只是读取文件中的几KB,然后关闭文件 - 导致服务器中的部分文件。 我不知道我做错了什么

0 个答案:

没有答案