2011-08-19 103 views
4

我在我的测试环境中两种不同类型的WCF客户端的使用如下超过basicHttpBinding的操作将文件发送到WCF服务:Base64编码的换行符在Visual Studio中造成巨大的性能损失

void SendFile(string filename, byte[] fileBytes) 

我注意到性能巨大差异。对于完全相同的文件和拓扑,SendFile在Client1上的时间少于1秒,但在Client2上的时间大约需要35-40s。

经过一些网络嗅探之后,我缩小了差异,直到base64编码内容中的某些换行符。两个客户端均以base64编码文本形式发送fileBytes。然而,Client2以某种方式在文本中插入了许多换行符。我可以始终如一地重现(使用WFetch)其他所有内容都是相同的,但这些换行本身导致了巨大的性能差异。

客户端1消息:

POST /ParkomatService/CommService HTTP/1.1 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://tempuri.org/ICommService/SendFile" 
Host: 192.168.10.36 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS .NET CF Web Services Client Protocol 3.5.7283.0) 
Cache-Control: No-Transform 
Connection: Keep-Alive 
Content-Length: 266863 


<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><SendFile xmlns="http://tempuri.org/"><filename>test.txt</filename><fileBytes>MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ...(continues)...EyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk=</fileBytes></SendFile></s:Body></s:Envelope> 

客户机2的消息:

POST /ParkomatService/CommService HTTP/1.1 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://tempuri.org/ICommService/SendFile" 
Host: 192.168.10.36 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS .NET CF Web Services Client Protocol 3.5.7283.0) 
Cache-Control: No-Transform 
Connection: Keep-Alive 
Content-Length: 273879 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><SendFile xmlns="http://tempuri.org/"><filename>test.txt</filename><fileBytes>MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2 
Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIz 
NDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkw 
MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3 
... 
(continues) 
... 
OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1 
Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk=</fileBytes></SendFile></s:Body></s:Envelope> 

为什么这些线路中断导致服务处理时间相差这么大?

编辑:在下面的Codo的评论的帮助下,我注意到这种差异只发生在Visual Studio中调试时。如果我直接运行自托管服务,那么换行符不会导致性能下降。所以,它在Visual Studio中一定是个问题。

+2

您对此问题的分析到目前为止的结论是,摘要Base-64数据是问题,而不是一些网络或I/O问题。请求处理后的35-40秒内,您是否看到高CPU负载? BTW。将Base-64数据分割成大约70到80个字符的行是最佳实践。 – Codo

+0

谢谢,问题解决了!我其实并没有看CPU的使用情况:)我在Visual Studio中以调试模式运行服务进程,以便能够查看不同的事情,并根据您的建议,我意识到CPU实际上被devenv 。可执行程序。在VS之外运行服务可执行文件的调试版本,没有问题!很有意思。 –

+0

@Codo你应该写一个答案,以便它可以被接受。 –

回答

1

事实证明,只有在连接了Visual Studio调试器的情况下运行服务时才会出现性能差异。当在VS外跑步时,差异消失了,带换行符的版本与其他版本具有相同的性能。

我不知道为什么这些行会打破VS的减速过程,但如果您在代码中看到任何性能问题,最好在您要尝试的事情列表上保持“在VS外运行”。

+0

https://dzone.com/articles/important-wcf-performance – TweeZz

相关问题