Медленный первый вызов веб-сервиса C # - PullRequest
3 голосов
/ 23 января 2012

Я пытаюсь получить доступ к веб-сервисам 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, но его посещают не так хорошо, как на этом форуме.Я могу сделать это, если здесь не найдено ответов.

Есть идеи?

1 Ответ

4 голосов
/ 23 января 2012

Первый вызов открывает канал (который является относительно дорогим), а второй вызов использует этот уже открытый канал (менее дорогой).

...