我正在尝试访问此处提供的PubMed网络服务:
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 Serializer。我跑了:
sgen /a:myProxyClassPubMed.dll /f
这创建了一个dll myProxyClassPubMed.XmlSerializers.dll,然后我在第二种连接类型中添加了它作为引用。
我还在应用程序的构建区域中搞乱了“生成序列化程序集”选项,但没有发现任何改进。
我想通过ASP.NET页面进行这些Web服务调用,因此第一次调用的十二秒返回时间是不可接受的。
我考虑在BioStar上提出这个问题,但是这个论坛的参与人数不多。如果没有找到答案,我可以这样做。
有什么想法吗?
答案 0 :(得分:4)
第一个电话打开频道(相对较贵),第二个电话使用已打开的频道(较便宜)。