3

ここで提供されている 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 に投稿することを検討しましたが、このフォーラムほど参加者が多くありません。ここで答えが見つからない場合は、そうするかもしれません。

何か案は?

4

1 に答える 1

4

最初の呼び出しはチャネルを開き (比較的コストがかかります)、2 番目の呼び出しは既に開いているチャネルを使用します (安価です)。

于 2012-01-23T16:31:09.950 に答える