Performance 流写入头占用WCF太多时间

Performance 流写入头占用WCF太多时间,performance,wcf,stream,httpwebrequest,newrelic,Performance,Wcf,Stream,Httpwebrequest,Newrelic,一个类似的问题也被问到了 我正在New Relic上评测我的WCF服务。有一个WCF服务调用另一个WCF服务。 现在,我假设在调用另一个WCF服务时,当它创建请求时,内部进程在某个地方将头写入请求流,这有时会很慢。 我在NewRelic中发现的痕迹告诉我,对于我的一个WCF服务调用另一个WCF服务的方法的特定方法,大约需要50-60秒,其中95-100%的时间由System.Net.ConnectStream.WriteHeaders消耗 Stream[url of WCF service/so

一个类似的问题也被问到了

我正在New Relic上评测我的
WCF
服务。有一个
WCF
服务调用另一个
WCF
服务。 现在,我假设在调用另一个WCF服务时,当它创建请求时,内部进程在某个地方将头写入请求流,这有时会很慢。 我在NewRelic中发现的痕迹告诉我,对于我的一个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服务,而不是流式传输

我花了一年的时间在一个项目上,这个项目听起来很像你正在做的。流式处理和缓冲之间的区别在于:

流式处理在您无法控制的交互过程中读取(源)数据,然后写入(目标)数据。如果源文件很大(如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

我以前也看到过同样的情况,当您调用的服务暂停或并发连接过多时。如果问题是前者,分析WCF服务可能有助于确定根本原因——可能是由于数据库访问或其他一些I/O绑定进程的原因,响应速度较慢。如果问题是后者,则可以通过调整服务的性能来解决()


对于NewRelic中的ASP.NET应用程序,这也可以表现为“BeginRequest”。BeginRequest或WriteHeader很少表示问题真正在于发送数据本身,尽管如果您的有效负载较大,也可能是这样,但在发送的数据较小的常规呼叫中,连接时间慢或响应慢的问题将出现在这两个区域。

嗨,Brian,我没有流任何大文件或什么。这只是我请求的WCF服务。我已将WCF服务的服务引用添加到我的项目中,该项目也是WCF服务。现在,我的服务中有一个名为GetMerchantData(string param1)的方法,它从数据库中获取一些值,然后调用添加的服务引用的方法:GetMerchantStoreData(string param1、string param2、string param3)。请求如下所示:MyServiceRefClient=new MyServiceRefClient();var result=client.GetMerchantStoreData(参数1、参数2、参数3);然后我从我的服务中返回这个结果。此结果对象包含12个属性。我不认为这是一个大数据,或任何流。我认为这与向ssl承载的wcf服务发出请求时编写一些默认头有关。但我想不出我能做些什么来减少这次。因为我还没有在我的代码中的任何地方编写这个行流[WCF服务/soap的url]:WriteHeaders。谢谢,我明白了。对不起,我无法进一步帮助您。您好@Deeps,您在这个问题上运气好吗?我们也面临着完全相同的问题。如果是的话,请分享一下。TIAHi texens,很抱歉回复晚了。不,我到现在还没有找到解决办法。