我在我的測試環境中兩種不同類型的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你應該寫一個答案,以便它可以被接受。 –