Сборка WCF XmlSerializer не ускоряет первый запрос - PullRequest
2 голосов
/ 12 мая 2010

Я генерирую прокси-классы для клиентов. Java webservice wsdls и xsd файлы с помощью svcutil. Первый вызов каждого прокси-класса службы занимает очень много времени. Я надеялся ускорить это, создав собственную сборку XmlSerializer (основываясь на статье Как: улучшить время запуска клиентских приложений WCF с помощью XmlSerializer ), но когда я делаю первый вызов для каждой службы по-прежнему занимает столько же времени. Вот шаги, которые я выполняю:

//generate strong name key file
sn -k Blah.snk

//generate the proxy class file
svcutil blah.wsdl blah2.wsdl blah3.wsdl ... base.xsd blah.xsd ... /UseSerializerForFaults /ser:XmlSerializer /n:*,SomeNamespace /out:Blah.cs

//compile the class into an assembly signing it with the strong name key file
csc /target:library /keyfile:Blah.snk /out:Blah.dll Blah.cs

//generate the XmlSerializer code this will give us Blah.XmlSerializers.dll.cs
svcutil /t:xmlSerializer Blah.dll

//compile the xmlserializer code into its own dll using the same key to sign it and referencing the original dll
csc /target:library /keyfile:Blah.snk /out:Blah.XmlSerializers.dll Blah.XmlSerializers.dll.cs /r:Blah.dll

Затем я создаю стандартное консольное приложение, которое ссылается на Blah.dll и Blah.XmlSerializers.dll. Затем я попробую что-то вроде:

//BlahProxy is one of the generated service proxy classes
BlahProxy p = new BlahProxy();
//this call takes 30ish seconds
p.SomeMethod();

BlahProxy p2 = new BlahProxy();
//this call takes < 1 second
p2.SomeMethod();

//BlahProx2y is one of the generated service proxy classes
BlahProxy2 p3 = new BlahProxy2();
//this call takes 30ish seconds
p3.SomeMethod();

BlahProxy2 p4 = new BlahProxy2();
//this call takes < 1 second
p4.SomeMethod();

Я знаю, что проблема не в серверной части, потому что я не вижу запроса, сделанного в Fiddler, около 29 секунд. Последующие вызовы каждой службы занимают <1 секунды, поэтому я надеялся, что основным замедлением была среда выполнения .net, которая генерировала сам код xmlserializer, компилировал его и загружал сборку. Я подумал, что это будет причиной того, что первый вызов к каждой службе медленный, а остальные быстрые. К сожалению, сам генерация кода ничего не ускоряет. Кто-нибудь видит, что я делаю не так? </p>

Ответы [ 2 ]

2 голосов
/ 12 мая 2010

Я считаю, что проблема не в сериализации XML, а в первом вызове прокси. Первый вызов прокси-сервера всегда займет много времени, потому что WCF должен настроить большое количество сантехники.

Если вы знаете, что будете выполнять последовательные вызовы на прокси-сервере (и у вас нет проблем с сеансом), то вам следует создать прокси-сервер как можно раньше и вызвать на нем Open. После того, как вы это сделаете, вы должны делать вызовы прокси-серверу так, как вам нужно, и распоряжаться им только по окончании.

Wenlong Dong подробно описывает лучшие практики, связанные с созданием прокси , в котором есть больше предложений о том, как можно оптимизировать производительность прокси.

1 голос
/ 12 мая 2010

Какие конечные точки предоставляет ваш сервис? Иногда задержка происходит из-за рукопожатий безопасности. Также я могу предложить вам использовать протокол net.tcp, если он отвечает требованиям вашего приложения, он быстрее других.

Я также могу предложить вам запустить службу с какой-то работы, потому что она всегда задерживает выполнение первого вызова прокси-сервера, а следующие вызовы (даже другими пользователями) выполняются быстрее.

Скажите, помогло ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...