2010-04-28 2 views
2

У меня есть управляемая служба Windows, в которой размещается несколько конечных точек WCF. Служба запускается автоматически при перезапуске ПК. После перезагрузки я считаю, что эта строка кода:Проблемы с конечными точками WCF, размещенные в службе Windows

ServiceHost wcfHost1 = new ServiceHost(typeof(WCFHost1)); 

в методе OnStart() службы занимает где-то между 15 - 20 секунд, чтобы выполнить. На самом деле у меня есть два таких утверждения, но второй выполняется в одно мгновение. Это первый, который занимает так много времени. Кто-нибудь знает, что может вызвать узкое место? Из-за этого иногда вызов превышает 30 секунд, и в результате SCM думает, что моя служба была отключена при попытке инициализировать себя. Теперь я знаю, что для меня легко просто открутить поток, чтобы сделать это, и сразу вернуться из OnStart(), но я хотел бы знать, что может вызвать эту задержку.

Это происходит только, когда служба запускается при перезагрузке ПК. Если ПК запущен и работает, служба запускает & останавливается менее чем за секунду.

+0

Первый вызов ServiceHost.Open(), вероятно, настроил бы всю среду выполнения WCF и все - на вторую или две ... –

+0

Какую версию Windows вы тестируете? –

ответ

0

This может предоставить дополнительную помощь. В принципе, я думаю, вам нужно выяснить, какие у вас есть зависимости, и добавить их в свой сервис, чтобы они начинались до вашего.

Это просто выстрел в темноте, но может быть, что .net framework еще не загружен. Возможно, вы можете попытаться установить автоматический запуск на автоматический запуск с задержкой, что позволит начать работу с инфраструктурой .NET и другими службами окон.

Также, когда приложение .net запускается, оно компилируется компилятором Just-In-Time. Это может ждать .net, чтобы скомпилировать его.

И наконец, в зависимости от типа используемого экземпляра WCF у вас может возникнуть проблема с тем, что конструктор займет некоторое время для инициализации.

Надеюсь, это поможет.

+0

@ daub815: Отложенный запуск недоступен на XP, и мне нужно это для работы с XP и Vista. И я знаю, что выполнение ctor сервиса практически ничего не делает. – Dilip

+0

@ daub815: Извините, я не видел вашу ссылку в первый раз. Моя не все так сложно. Эта простая строка создания ServiceHost в моем OP - это место, где лежит узкое место. – Dilip

+0

Эта простая линия делает намного больше под обложками, и если это происходит только при запуске, то есть еще одна служба, которую нужно запустить до вашего. – kevindaub

0

У меня возникли проблемы с Windows Service, которые заняли много времени. Я узнал, что это произошло из-за подписанных сборок, которые я использовал (Enterprise Library). .NET пыталась проверить подпись Authenticode при загрузке сборки (возможно, ваш constuctor использует тип в первый раз, что вызывает загрузку этой сборки). Просто попробуйте добавить следующее к вашему app.config. Когда это не сработает, возникает другая проблема.

<configuration> 
    <runtime> 
     <generatePublisherEvidence enabled="false"/> 
    </runtime> 
</configuration> 

Вы также можете найти дополнительную информацию здесь: http://support.microsoft.com/kb/936707 и Why is my .Net app contacting Verisign?

0

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

+0

извините, но его проблема возникает при открытии «ServiceHost», а не при вызове операции. –

Смежные вопросы