听起来您正在从客户端流式传输一个大文件,在一个 WCF Web 服务中捕获它,然后将数据重新写入新的 HttpWebRequest,然后将其发送到另一台主机。我想我很想尝试将数据从客户端缓冲到您的 Web 服务而不是流式传输。
去年我一直在从事一个听起来与您正在做的事情相似的项目。流式传输和缓冲之间的区别是:
流式读取(从源)然后在交互过程中写入(到目标)数据,您没有太多控制权。如果源文件很大(例如 gig 或更多),WCF 请求/响应将在请求完成之前在客户端和主机之间来回迭代十几次或更多次。
另一方面,缓冲在填充请求并将其发送到主机之前累积目标文件的全部内容,从而加快处理速度。并且由于缓冲(在内存中累积字节所需的时间)导致的性能损失被放置在客户端上,因此通常不是问题。
因此,当从客户端缓冲数据时,您的主机将收到一个带有完整字节数组(比方说)的 Http 请求,该请求已准备好重新打包到您传递到第二个目标 WCF 主机的请求中。在这一点上,您可以再次在缓冲和流式传输之间进行选择。在主机上,性能很重要,将请求流式传输到第二台主机将提高您的可伸缩性,但(再次)可能会损害您的性能速度。
在客户端:
With binding
.TransferMode =TransferMode.Buffered 'instead of Transfermode.Streamed
.MessageEncoding = WSMessageEncoding.Text
.TextEncoding = System.Text.Encoding.UTF8
.MaxReceivedMessageSize = Integer.MaxValue
.ReaderQuotas.MaxArrayLength = Integer.MaxValue
.ReaderQuotas.MaxBytesPerRead = Integer.MaxValue
.ReaderQuotas.MaxDepth = Integer.MaxValue
.ReaderQuotas.MaxNameTableCharCount = Integer.MaxValue
.ReaderQuotas.MaxStringContentLength = Integer.MaxValue
.MaxBufferSize = Integer.MaxValue
.MaxBufferPoolSize = Integer.MaxValue
在主机方面:
With binding
.TransferMode = TransferMode.Buffered
.MaxReceivedMessageSize = Integer.MaxValue