我想這裏所提供訪問考研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上的位置,但它沒有像這個論壇那樣出席。如果在這裏找不到答案,我可以這樣做。
任何想法?
您的WCF服務是如何託管的?如果您在IIS中託管,那麼有可能第一次調用必須啓動整個WCF運行時基礎架構(一個「ServiceHost」等)。這將比任何後續調用更昂貴... –
@marc_s這一切都在我的一個控制檯應用程序完成。我還沒有在ASP.NET頁面上運行它 –