1. 程式人生 > >C#中客戶端建立webservice的soapclient類物件例項時間過長

C#中客戶端建立webservice的soapclient類物件例項時間過長

問題描述我寫的一個C/S架構的程式,是Client->WebService->DB方式設計的,程式部署之後,很多人反映程式啟動的時候很慢,有些人電腦上點選程式圖示後要等10-20秒鐘才能顯示主介面。在有些人機器上就很快,一秒鐘不到就進到主介面中了。通過對多臺計算機進行測試,大約有20%到40%的計算機上都會有這種問題。問題定位最初以為是網路的問題,因為有些人電腦上很快,有些人就很慢,如果是程式有問題,那麼應該是所有人都有問題才對。所以先找負責網路的同事諮詢是否是網路的問題。在該同事的機器上裝了一個客戶端,程式啟動時很慢,但是通過網路工具測試,在客戶端訪問webservice所在的計算機速度正常,不像是網路的問題。然後就看程式原始碼,但是光看原始碼也沒有用。最後只能採用比較笨的方法來定位——記日誌。從程式啟動開始,隔幾句程式碼就記錄一下當先系統時間,直至記錄到耗時最長的語句為止。雖然方法比較笨,但最終還是定位到了什麼地方比較耗時。假設webservice名稱為UserWebService.asmx,在客戶端建立服務引用,建立相應的服務引用類,我在客戶端中使用的是自動生成的UserServiceSoapClient類。我在客戶端主程式的建構函式中初始化了該類的一個例項物件,即m_userOpt = new UserServiceSoapClient();就是這句程式碼耗費了很長時間,在另外一個同事的計算機上做測試時,這句程式碼執行花費了15秒的時間,簡直無語了。問題還原
該程式最初是在VS2008中用.net framework 3.5開發的,後來由於應用系統整合,將該程式放在了另外的解決方案內。.net framework的版本雖然沒有變化,但是VS的版本從2008變成了2012,然後在vs2013中又重新重新整理了WebService服務。然後就出現了本文剛開始描述的問題。問題解決方案通過查詢相關資料,在本文後附的參考檔案中介紹。是由於呼叫WebService時的序列化、反序列化造成的時間過長。雖然試了參考文獻中給出的解決方案,但並沒有解決問題。通過實踐發現,將.net的framework版本由3.5改為4.0,然後重新編譯該程式就可以解決該問題。另外,我是採用的service reference方式使用服務,聽同事說採用web reference方式引用服務也不會出現該問題。
另外,還有同事沒有使用VS自動生成的程式碼,而是自己使用微軟的工具手動重新整理服務生成類檔案,這種好像也可以解決問題,不過我沒有試,僅列在這裡以供參考。參考文獻:[1]http://stackoverflow.com/questions/172095/slow-soaphttpclientprotocol-constructor[2]https://weblog.west-wind.com/posts/2005/Dec/14/Slow-Http-client-calls-from-ASPNET-20-Make-sure-you-check-your-Proxy-Settings[3]http://www.cnblogs.com/xienb/p/3318199.html[4]http://www.cppblog.com/eday/articles/36045.html[5]https://social.msdn.microsoft.com/Forums/zh-CN/f6241d48-ea14-491d-96d0-0773a2bc1d91/winform-webservice-?forum=visualcshartzhchs[6]http://blog.csdn.net/rrrfff/article/details/6170653
[7]http://stackoverflow.com/questions/784918/asmx-web-service-slow-first-request