我的测试环境中有两种不同类型的WCF客户端,通过basicHttpBinding使用类似下面的操作将文件发送到WCF服务:
void SendFile(string filename, byte[] fileBytes)
我注意到了性能上的巨大差异。对于完全相同的文件和拓扑,SendFile在Client1上的时间不到1秒,但在Client2上需要大约35-40秒。
经过一些网络嗅探后,我将差异缩小到base64编码内容中的某些换行符。两个客户端都将fileBytes作为Base64编码文本发送。但是,Client2以某种方式在文本中插入了许多换行符。我可以持续地再现(使用WFetch)所有其他相同的东西,这些断行单独导致这种巨大的性能差异。
Client1消息:
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>
Client2消息:
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中的一个问题。答案 0 :(得分:1)
事实证明,只有在附加了Visual Studio调试器的情况下运行服务时才会出现性能差异。在VS外部运行时,差异消失了,带换行符的版本具有相同的性能。
我不确定为什么这些线路会破坏VS这么多,但如果您在代码中发现任何性能问题,最好在您要尝试的事项列表中保持“在VS外运行”。