Я пытаюсь получить доступ к веб-сервисам PubMed, как указано здесь:
http://www.ncbi.nlm.nih.gov/entrez/eutils/soap/v2.0/DOC/esoap_help.html
Я написал код в Java для доступа к веб-сервису и возвратавремя было порядка менее 1 секунды.Я написал код на C # для доступа к той же веб-службе, и время возврата было порядка 12 секунд для первоначального вызова, а затем менее 1 секунды для всех последующих вызовов.
Я пытался писать в веб-сервис на C # двумя способами - оба как консольные приложения.Сначала был стандартный «щелчок правой кнопкой мыши по ссылкам и выполнение« Добавить ссылку на службу »», которая добавит информацию в app.config, и вы сможете легко и просто делать вызовы.Вторым было использование wsdl.exe для создания dll и доступ к веб-сервису как можно более «напрямую» (без мастеров).Оба способа дают одинаковый результат.Я опубликую оба соответствующих фрагмента кода.
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, чтобы 12-секундное время возврата при первом вызове было неприемлемым.
Я подумывал разместить это на BioStar, но его посещают не так хорошо, как на этом форуме.Я могу сделать это, если здесь не найдено ответов.
Есть идеи?