ここで提供されている PubMed Web サービスにアクセスしようとしています。
http://www.ncbi.nlm.nih.gov/entrez/eutils/soap/v2.0/DOC/esoap_help.html
Web サービスにアクセスするコードを Java で記述したところ、戻り時間は 1 秒未満でした。同じ Web サービスにアクセスするコードを C# で記述したところ、最初の呼び出しで約 12 秒、その後の呼び出しでは 1 秒未満でした。
私は、C# で Web サービスに 2 つの方法で書き込もうとしました。どちらもコンソール アプリケーションです。1 つ目は、app.config に情報を追加する標準的な「参照を右クリックして [サービス参照を追加] を実行する」ことで、呼び出しを簡単に行うことができます。2 つ目は、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 が作成され、2 番目の接続タイプの参照として追加されました。
アプリのビルド領域にある「シリアライゼーション アセンブリの生成」オプションもいじりましたが、改善は見られませんでした。
ASP.NET ページを介してこれらの Web サービス呼び出しを行いたいので、最初の呼び出しで 12 秒の戻り時間が許容されません。
これを BioStar に投稿することを検討しましたが、このフォーラムほど参加者が多くありません。ここで答えが見つからない場合は、そうするかもしれません。
何か案は?