Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当服务器处于流模式时,需要帮助在C#客户端(HttpWebRequest)中流式传输大数据吗_C#_Wcf_Streaming - Fatal编程技术网

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

当服务器处于流模式时,需要帮助在C#客户端(HttpWebRequest)中流式传输大数据吗,c#,wcf,streaming,C#,Wcf,Streaming,我抓狂了,-我无法将大数据上传到WCF服务器。 我看到一篇帖子建议使用异步编程,因为它忽略了HTTPWebRequest超时。 我看到了几个问题: 在执行“GetRequestStream/GetRequestStreamAsync”时,服务器端不会发生任何事情,上载方法不会被调用 在流中执行Write/WriteAsync时,服务器端不会发生任何事情,不会调用upload方法 当执行“GetResponse/GetResponseAsync”时,只有这样,上载方法才会启动。如果我关闭客户机应用

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

  • 在执行“GetRequestStream/GetRequestStreamAsync”时,服务器端不会发生任何事情,上载方法不会被调用
  • 在流中执行Write/WriteAsync时,服务器端不会发生任何事情,不会调用upload方法
  • 当执行“GetResponse/GetResponseAsync”时,只有这样,上载方法才会启动。如果我关闭客户机应用程序,服务器仍会上载文件,也就是说,流式数据会写入客户机进程之外的某个地方
  • 我试过使用flush/不使用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的数据,然后关闭了文件——导致服务器中出现部分文件。
    我不知道我做错了什么

    如果要向WCF服务发送大数据,则需要在应用程序/web配置中增加其绑定中的MaxReceivedMessageSize

    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IRandomService" 
                         maxReceivedMessageSize="2147483647"/>
           </basicHttpBinding>
        </bindings>
        <client>
           <endpoint address="http://localhost:4568/Random" binding="basicHttpBinding"
              bindingConfiguration="BasicHttpBinding_IRandomService" 
              contract="BusinessServiceAPI.IRandomService"
              name="BasicHttpBinding_IRandomService" />
        </client>
    </system.serviceModel>
    

    如果要向WCF服务发送大数据,则需要在应用程序/web配置中增加其绑定中的MaxReceivedMessageSize

    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IRandomService" 
                         maxReceivedMessageSize="2147483647"/>
           </basicHttpBinding>
        </bindings>
        <client>
           <endpoint address="http://localhost:4568/Random" binding="basicHttpBinding"
              bindingConfiguration="BasicHttpBinding_IRandomService" 
              contract="BusinessServiceAPI.IRandomService"
              name="BasicHttpBinding_IRandomService" />
        </client>
    </system.serviceModel>
    
    
    
    尝试一块一块地发送数据,而不是发送整个文件。只有当你有大文件时才发送此套件。@Chandru这就是我所做的。.查看写入循环。它不工作,服务器在请求流关闭之前不会弹出任何内容…@ArielB但你说只有在调用GetResponse/GetResponseAsync时才开始上载?那又如何n当客户端调用stream.Close或客户端在GetResponse处调用GetResponse/GetResponseAsync?@codewarrior时,服务端确实可以获取数据。然后服务器服务启动。因此,它将数据缓存在某个位置。这不是我想要尝试逐块发送数据而不是发送整个文件的目的。只有当您有arge文件。@Chandru这就是我要做的。。看到写循环。它不工作,服务器在请求流关闭之前不会弹出任何东西…@ArielB但你说过上载只在调用GetResponse/GetResponseAsync时开始?那么服务端什么时候才能获取数据?当客户端调用stream.Close时还是当客户端调用GetResponse时/GetResponseAsync?@codewarrior位于GetResponse。然后服务器服务启动。因此它将数据缓存到某个位置。这不是我想要的。我已经做了,我的问题不是我不能发送大文件,问题是服务器直到请求流关闭后才启动。我不知道流写入哪里。我已经不知道了我的问题不是我不能发送大文件,问题是服务器在请求流关闭之前不会启动。我不知道流写入哪里。