Запуск службы Topshelf с использованием ConfigureServiceInIsolation - универсальный хост - PullRequest
3 голосов
/ 29 июля 2010

Я разрабатываю очень простое решение Generic Host, которое позволит нам размещать сборки в качестве служб Windows (аля NServiceBus).Я сталкиваюсь со следующим исключением (похоже на комментарии, упомянутые в блоге Дру ).Мне нужно, чтобы это работало, чтобы я мог размещать службы в разных доменах приложений.

"Тип" MyProject.WindowsServices.GenericHost.Program + <> c__DisplayClass5 'в сборке "MyProject.WindowsServices.GenericHost, Version = 1.0.0.0, Culture= нейтральный, PublicKeyToken = null 'не помечен как сериализуемый. "

Я использую двоичные файлы Topshelf 1.0 RC, доступные по ссылке для скачивания на домашней странице topshelf (topshelf-project.com).Я попробовал последнюю сборку (29/07/2010), и сборки доступны для загрузки из кода Google и GitHub!Я не могу заставить никого из них работать на меня!

Это работает в библиотеке NServiceBus с более старой версией Topshelf (dll имеет версию 0.8.0.96).С некоторыми незначительными изменениями кода в том, что у меня есть ниже (используйте CreateServiceLocator вместо HowToBuildService), он работает для меня с этими более старыми двоичными файлами, но я бы предпочел придерживаться новейшего кода, чтобы воспользоваться преимуществами любых запланированных исправлений или улучшений.

Вот мой код.

static void Main(string[] args)
{
    ArgumentParser arguments = new ArgumentParser(args);
    string configFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
        arguments.ServiceType.Assembly.ManifestModule.Name + ".config");

    RunConfiguration cfg = RunnerConfigurator.New(x =>
    {
        x.SetServiceName(arguments.ServiceName);
        x.SetDisplayName(arguments.DisplayName);
        x.SetDescription(arguments.Description);

        if (string.IsNullOrEmpty(arguments.UserName))
        {
            x.RunAsLocalSystem();
        }
        else
        {
            x.RunAs(arguments.UserName, arguments.Password);
        }

        x.ConfigureServiceInIsolation<GenericHost>(c =>
        {
            c.ConfigurationFile(configFile);
            c.Named(arguments.ServiceType.AssemblyQualifiedName);
            c.HowToBuildService(name => new GenericHost(arguments.ServiceType));
            c.WhenStarted(tc => tc.Start());
            c.WhenStopped(tc => tc.Stop());
        });
    });

    Runner.Host(cfg, args);
}

Также следует отметить, что мой класс GenericHost и класс, идентифицированный посредством arguments.ServiceType, оба реализуют MarshalByRefObject, и я также сделал эти классы Serializable, чтобы увидеть, поможет ли это,Однако не эти классы вызывают проблему, а жалуются на анонимный тип, сгенерированный компилятором C # для одной или нескольких лямбда-конфигураций, которые я настроил.

Кто-нибудь еще сталкивался с этой проблемой при использованииConfigureServiceInIsolation ()?Если нет, кто-нибудь знает, что мне здесь не хватает?Дайте мне знать, если вам нужна дополнительная информация, например, трассировка стека или больше кода.

1 Ответ

0 голосов
/ 29 июля 2010

Если вы используете только один сервис внутри хоста, я бы удалил «InIsolation».Это не работает правильно, но в будущей версии TopShelf (мы сейчас над этим работаем), я думаю, у нас есть лучший ответ на этот вопрос.Помимо возможности просто перетаскивать файлы на хосте, и это автоматически раскручивает ваш сервис в новом домене приложений.

Я бы сказал, что это подпадает под известную проблему, и если только нет веской причины использовать InIsolation, избегайте ее на данный момент.Вы не можете распределить лямбда-выражения через барьеры домена приложения, поэтому проблема, с которой вы столкнулись.Если проблема InIsolation достаточно важна, я могу попытаться исправить ее в зависимости от сроков, прежде чем мы планируем выпустить последнюю версию.[Вы можете взять последнюю версию Dev.биты отсюда: http://github.com/legomaster/Topshelf - предупреждение, мы все еще находимся в активной разработке, но я думаю, что все основные ошибки теперь устранены].

Если вы хотите обсудить это дальше, возможно, будет проще всего опубликовать в списке MassTransit, где следят все разработчики: http://groups.google.com/group/masstransit-discuss

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

...