2012-01-23 93 views
3

我想這裏所提供訪問考研Web服務:慢首次調用C#Web服務

http://www.ncbi.nlm.nih.gov/entrez/eutils/soap/v2.0/DOC/esoap_help.html

我在Java訪問Web服務和返回時間寫代碼大約不到1秒。我用C#編寫代碼來訪問同一個Web服務,返回時間對於初始調用爲12秒,對於所有後續調用,返回時間不到1秒。

我試圖用兩種方式寫入到C#中的Web服務 - 這兩種方式都是作爲控制檯應用程序。首先是標準的「右鍵點擊引用,然後點擊」添加服務引用「,這會將信息添加到app.config中,並且可以使呼叫變得更加簡單。第二個是使用wsdl.exe創建一個dll,並儘可能「直接」訪問Web服務(無嚮導)。兩種方式都可以提供相同的結果我將發佈兩個相應的代碼片段。

1) (從添加服務引用嚮導)

http://www.ncbi.nlm.nih.gov/entrez/eutils/soap/v2.0/efetch_pubmed.wsdl (as Namespace: PubMedWebServiceEfetch_pubMed) 

(在代碼)

Stopwatch sw = new Stopwatch(); 
PubMedWebServiceEfetch_pubMed.eUtilsServiceSoapClient server = new PubMedWebServiceEfetch_pubMed.eUtilsServiceSoapClient(); 
try 
{ 
    PubMedWebServiceEfetch_pubMed.eFetchRequest searchRequest = new PubMedWebServiceEfetch_pubMed.eFetchRequest(); 
    searchRequest.id = "11850928"; 
    Console.WriteLine("Run server.run_eFetch(theRequest). [Reset stopwatch]"); 
    sw.Restart(); 
    PubMedWebServiceEfetch_pubMed.eFetchResult searchResult = server.run_eFetch(searchRequest); 
    Console.WriteLine(searchResult.Count() + " - elapsed milliseconds = " + sw.ElapsedMilliseconds); 
    sw.Stop(); 
} 
catch (Exception e1) { Console.WriteLine(e1); } 
finally { server.Dispose(); } 

2) (來自命令行)

wsdl /out:myProxyClassPubMed.cs http://eutils.ncbi.nlm.nih.gov/soap/v2.0/efetch_pubmed.wsdl 
csc /t:library MyProxyClassPubMed.cs 

(添加DLL到控制檯應用程序)

Stopwatch sw = new Stopwatch(); 
eFetchPubmedService service = new eFetchPubmedService(); 
try 
{ 
    eFetchRequest theRequest = new eFetchRequest(); 
    theRequest.id = "11850928"; 
    Console.WriteLine("Run service.run_eFetch(theRequest). [Reset stopwatch]"); 
    sw.Restart(); 
    eFetchResult searchResult = service.run_eFetch(theRequest); 
    Console.WriteLine(searchResult.Count() + " - elapsed milliseconds = " + sw.ElapsedMilliseconds); 
    sw.Stop(); 
} 
catch (Exception e1) { Console.WriteLine(e1); } 
finally { service.Dispose(); } 

經過多次搜索,我發現你應該能夠使用sgen創建XML序列化程序。我跑:

sgen /a:myProxyClassPubMed.dll /f 

這創造一個DLL myProxyClassPubMed.XmlSerializers.dll然後我加入作爲在所述第二連接類型的引用。

我也在應用程序的構建區域中的「生成序列化程序集」選項搞亂了,沒有找到任何改進。

我想通過ASP.NET頁面進行這些Web服務調用,因此在第一次調用中返回12秒的時間是不可接受的。

我認爲這是在BioStar上的位置,但它沒有像這個論壇那樣出席。如果在這裏找不到答案,我可以這樣做。

任何想法?

+0

您的WCF服務是如何託管的?如果您在IIS中託管,那麼有可能第一次調用必須啓動整個WCF運行時基礎架構(一個「ServiceHost」等)。這將比任何後續調用更昂貴... –

+0

@marc_s這一切都在我的一個控制檯應用程序完成。我還沒有在ASP.NET頁面上運行它 –

回答

4

第一次通話打開通道(相對昂貴),第二次通話使用已經打開的通道(較便宜)。

+0

感謝您的迴應。有沒有什麼辦法(通過XMLSerializers /別的?)來加速這個頻道的開放?爲什麼在JAVA中不是這種情況? –

+0

首先想到的是做一些分析,看看瓶頸在哪裏。根據您使用的分析工具,您可能需要打開一個選項才能看到.NET框架方法。除此之外,您可以嘗試打開一個頻道並在用戶真正需要打電話之前保持打開。 – RQDQ