当服务器处于流模式时,需要帮助在C#客户端(HttpWebRequest)中流式传输大数据吗
我抓狂了,-我无法将大数据上传到WCF服务器。 我看到一篇帖子建议使用异步编程,因为它忽略了HTTPWebRequest超时。 我看到了几个问题:当服务器处于流模式时,需要帮助在C#客户端(HttpWebRequest)中流式传输大数据吗,c#,wcf,streaming,C#,Wcf,Streaming,我抓狂了,-我无法将大数据上传到WCF服务器。 我看到一篇帖子建议使用异步编程,因为它忽略了HTTPWebRequest超时。 我看到了几个问题: 在执行“GetRequestStream/GetRequestStreamAsync”时,服务器端不会发生任何事情,上载方法不会被调用 在流中执行Write/WriteAsync时,服务器端不会发生任何事情,不会调用upload方法 当执行“GetResponse/GetResponseAsync”时,只有这样,上载方法才会启动。如果我关闭客户机应用
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。然后服务器服务启动。因此它将数据缓存到某个位置。这不是我想要的。我已经做了,我的问题不是我不能发送大文件,问题是服务器直到请求流关闭后才启动。我不知道流写入哪里。我已经不知道了我的问题不是我不能发送大文件,问题是服务器在请求流关闭之前不会启动。我不知道流写入哪里。