каков эквивалент global.asax Application_Start при использовании WAS в IIS7

Я хотел бы использовать netTcpBinding для моего приложения WCF, которое в настоящее время размещено в IIS7, что означает его настройку для использования вместо этого WAS. Однако это довольно просто, мое приложение ранее использовало событие Application_Start в файле global.asax. Мне не нужен доступ к httpContext (доступ к которому, как я понимаю, был удален в IIS7), однако я все же хотел бы подключиться к методам start или init?

Существует ли эквивалент при размещении приложения в WAS, а не в IIS7?

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


person Mike Tours    schedule 16.03.2010    source источник


Ответы (2)


Я считаю, что AppInitialize() - это тот метод, который вы ищете. Вот статья об использовании его для инициализации Castle Windsor в WAS-службе WCF:

Замок Windsor и службы WCF без протокола HTTP

Суть статьи в том, что вместо использования Application_Start(), который не будет вызываться в WAS:

protected void Application_Start(object sender, EventArgs e)
{
   var container = new WindsorContainer("ioc.config");
   DefaultServiceHostFactory.RegisterContainer(container.Kernel);
}

Использовать:

public class InitialiseService
{
   /// <summary>
   /// Application initialisation method where we register our IOC container.
   /// </summary>
   public static void AppInitialize()
   {
      var container = new WindsorContainer("ioc.config");
      DefaultServiceHostFactory.RegisterContainer(container.Kernel);
   }
}

Процитирую Мэтта:

Признаюсь, я потратил некоторое время на изучение Host Factory более подробно, пытаясь обернуть DefaultServiceHostFactory. Однако кажется, что существует гораздо более простое решение - использовать мало задокументированный метод AppInitialize. Если вы создадите класс (любой класс), поместите его в папку ASP.NET App_Code в своем проекте и дадите ему подпись метода, как определено ниже, этот маленький ребенок будет уволен именно тогда, когда вы этого захотите. Затем вы можете инициализировать свой контейнер IoC там.

person Kev    schedule 16.03.2010
comment
Спасибо за ответ. Я сталкивался с этим, но это выглядит довольно хакерским, если мягко сказать ... Я действительно не думал, что мне придется полагаться на папку app_code ... неужели нет другой подходящей замены? - person Mike Tours; 16.03.2010
comment
Но, похоже, он игнорируется VS Web Server (он же Casini, ASP.NET Dev Server) - person abatishchev; 07.12.2012
comment
@abatishchev - А что с IIS Express? - person Kev; 07.12.2012
comment
То же. Мне нужно разработать собственное расширение WCF, чтобы оно работало независимо от хоста, на котором работает служба. Странный. Интересно, почему нет такого встроенного функционала. - person abatishchev; 07.12.2012

AppInitialize - допустимый метод инициализации вашего сервиса. Но есть и другие методы, которые могут вам подойти, и они описаны в этой статье: Как инициализировать размещенные службы WCF

ПРИМЕЧАНИЕ: исходная ссылка исчезла. Ссылка выше - это копия на archive.org.

person grahamesd    schedule 08.12.2011
comment
Спасибо, Грэм - у меня не было возможности взглянуть на этот фрагмент кода, чтобы проверить его, но статья действительно выглядит лучшим вариантом, чем полагаться на другие хакерские решения. - person Mike Tours; 06.02.2012
comment
Application_Start запускает один для всего приложения. Использование фабрики служб, как в вашей ссылке, будет запускаться один раз для каждой службы, поэтому вам потребуется дополнительная логика, чтобы ваш код не запускался дважды. - person Nelson Rothermel; 21.02.2014
comment
Ссылка @grahamesd, упомянутая в этом ответе, не найдена. Приходит страница 404. - person Ashish Shukla; 11.06.2020
comment
Статью также можно найти здесь - person Chuck Lu; 05.02.2021