gpt4 book ai didi

performance - 流 writeheaders 花费太多时间 WCF

转载 作者:行者123 更新时间:2023-12-04 03:04:03 26 4
gpt4 key购买 nike

NewRelic stream & writeHeaders 也提出了类似的问题

我正在分析我在 New Relic 上的 WCF 服务。有一个 WCF 服务调用另一个 WCF 服务。现在我想在调用其他 WCF 服务时,当它创建请求时,内部进程在某处将标​​头写入请求流,这有时很慢。我在 New Relic 中发现的痕迹告诉我,对于我的一个 WCF 服务调用另一个 WCF 服务的方法的特定方法,大约需要 50-60 秒,其中 95-100 % 的时间被 System.Net.ConnectStream.WriteHeaders 消耗。

Stream[url of WCF service/soap]: WriteHeaders -> 99.78 % time (approx 49 seconds).

我不明白这是什么以及如何减少这段时间?

我进行了搜索,但没有找到 ConnectStream 实际执行的操作或有关它的一些详细信息,因此我无法找到任何方法来减少它所花费的时间。

请告诉我您的建议。

最佳答案

听起来您正在从客户端流式传输一个大文件,在一个 WCF Web 服务中捕获它,然后将数据重新写入一个新的 HttpWebRequest,然后将其发送到另一台主机。我想我很想尝试将数据从客户端缓冲到您的 Web 服务而不是流式传输。

去年我一直致力于一个听起来与您正在做的事情相似的项目。流式传输和缓冲之间的区别是:

流式读取(从源)然后写入(到目标)交互式过程中的数据,您无法对其进行太多控制。如果源文件很大(如演出或更多),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

关于performance - 流 writeheaders 花费太多时间 WCF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16034937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com