我在我的测试环境中两种不同类型的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中一定是个问题。
您对此问题的分析到目前为止的结论是,摘要Base-64数据是问题,而不是一些网络或I/O问题。请求处理后的35-40秒内,您是否看到高CPU负载? BTW。将Base-64数据分割成大约70到80个字符的行是最佳实践。 – Codo
谢谢,问题解决了!我其实并没有看CPU的使用情况:)我在Visual Studio中以调试模式运行服务进程,以便能够查看不同的事情,并根据您的建议,我意识到CPU实际上被devenv 。可执行程序。在VS之外运行服务可执行文件的调试版本,没有问题!很有意思。 –
@Codo你应该写一个答案,以便它可以被接受。 –