2012-04-09 6 views
3

У меня есть простое приложение, в котором я использую global.asax для сопоставления serviceroute с wcf-сервисом через пользовательский servicehostfactory в Application_Start. Конструктор этой службы выполняет некоторую начальную обработку для настройки службы, которая занимает немного времени.Как мне получить услугу, чтобы начать с global.asax без необходимости ее вызывать?

Мне нужен этот конструктор для запуска, когда его serviceroute добавляется автоматически. Я попытался создать clientchannel из global.asax и сделать фиктивный вызов, чтобы развернуть службу, но обнаружил, что служба еще не встала - кажется, приложение application_start должно вернуться?

Как я могу заставить конструктор службы запускаться при первом сопоставлении через global.asax без необходимости вручную удалять службу? К сожалению AppFabric это не вариант для нас, так что я не могу просто использовать это встроенный в автозапуск ..

UPDATE

меня попросили немного более подробно;

Это похоже на службу управления маршрутами. Поэтому у меня есть Service1 - он добавляется как serviceroute в global.asax. Теперь у меня есть http://localhost/Service1

Внутри Service1 У меня есть метод под названием addServiceRoute. При вызове он также регистрирует маршрут для Service2. Теперь у меня есть http://localhost/Service1/Service2.

Моим первоначальным решением от global.asax было построить канал для http://localhost/service1, но это не сработало. Service1 еще не был включен и не появлялся до появления Application_Start (все еще не уверен, почему?). Итак, я подумал, что обманываю и перемещаю этот начальный adderviceroute вызов конструктору service1. И не работал.

Было упомянуто, что это не должно быть в конструкторе - я согласен, это просто проверка кода.

Был упомянут синглтон, который может быть в порядке, но я намерен иметь более одного экземпляра Service1 на машине (в том же пуле приложений), поэтому я не думаю, что это сработает?

** UPDATE # 2 ** меня попросили образец кода .. здесь из global.asax (обрезается немного для краткости) .. Так http://localhost/Test приходит вверх .. Но если я должен использовать AppFabric разогреть Тест и запустить его конструктор, тогда мне не нужно Test.svc или что-то еще? Как я могу получить appfabric, даже если эта служба существует?

protected void Application_Start(object sender, EventArgs e) 
     { 
      RouteTable.Routes.Ignore("{resource}.axd/{*pathInfo}"); 
      RouteTable.Routes.Add(
       new ServiceRoute("Test", new MyServiceHostFactory(ITestService, BindingType.BasicHttpBinding, true), TestService)); 
     } 
+0

Если бы вы могли добавить немного больше информации, я думаю, что смогу вам помочь. Вы говорите, что хотите, чтобы метод WCF вызывался при запуске пула приложений? Что AppFabric связано с этим, вы используете это для своего рода кеширования? –

+0

Обновление в статье с деталями – XeroxDucati

+0

Это связано с AppFabric в том, что AppFabric больше, чем кеширование, оно также помогает управлять службами WCF. См. Http://msdn.microsoft.com/en-us/library/ee677285.aspx для получения информации о автозапуске. – Rich

ответ

2

То, что вы описали требует одноплодной службы (то, что вам следует избегать), потому что обычно каждый вызов или сеанс получает новый экземпляр = новый вызов конструктора. В самостоятельной службе WCF вы можете создать экземпляр экземпляра Singleton и передать его в конструктор ServiceHost. В случае размещения службы IIS, используемой вместе с ServiceRoute, вы можете попытаться создать свой собственный класс, полученный из ServiceHostFactory, и передать созданный экземпляр службы в качестве параметра его конструктору. В этом фабричном классе выполните метод CreateServiceHost и передайте этот существующий экземпляр службы в конструктор ServiceHost. Чтобы выполнить эту работу, ваш класс обслуживания все равно должен обрабатываться как singleton through service behavior.

КПП. конструктор не должен занимать много времени. Конструктор предназначен для построения объекта не для инициализации инфраструктуры. Использование конструктора для такой инициализации - это, во-первых, неправильная практика.

2

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

В качестве альтернативы до того, как AppFabric существует, вам нужно будет использовать запланированную задачу (a.k.a cron job) с исполняемым файлом, который вызывает службу, которую вы хотите инициализировать. Автозапуск AppFabric работает на using named pipes (net.pipe) to trigger the warm up, но он просто делает это точно, когда услуга перерабатывается. Разница между планируемым подходом к задаче и автозапуском AppFabric заключается в том, что запланированная задача не знает, когда ваш пул приложений был переработан - вам нужно периодически опросить ваш сервис, чтобы он был теплым.

В качестве альтернативы вы можете рассмотреть возможность размещения своего приложения WCF за пределами IIS посредством самостоятельного хостинга. Это позволит избежать разминки, но вы не достигнете многих преимуществ контейнера, размещенного в IIS. См. HttpSelfHostServer in the new MVC Web API или review using a standard ServiceHost.

+0

AppFabric - проблема для меня, главным образом, потому что она не знает, что существует служба. Все делается через ServiceRoute, поэтому приложение при запуске - это просто global.asax, что означает, что приложение не знает, что это сервис для разминки .. Есть ли способ заставить appfabric работать без файла svc, находящегося там? – XeroxDucati

+0

@XeroxDucati Вы должны добавить образец кода из своего 'global.asax', чтобы мы могли видеть соответствующий контекст. – SliverNinja

+0

добавив в обновлении .. – XeroxDucati

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

  • Нет связанных вопросов^_^