簡體   English   中英

使用ConfigureServiceInIsolation - Generic Host運行Topshelf服務

[英]Running Topshelf service using ConfigureServiceInIsolation - Generic Host

我正在開發一個非常簡單的通用主機解決方案,它允許我們將程序集作為Windows服務托管(ala NServiceBus)。 我遇到了以下異常(類似於Dru的博客文章中提到的評論)。 我需要這個工作,所以我可以在不同的AppDomain中托管服務。

“在程序集'MyProject.WindowsServices.GenericHost中輸入'MyProject.WindowsServices.GenericHost.Program + <> c__DisplayClass5',Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'未標記為可序列化。”

我正在使用Topshelf主頁(topshelf-project.com)上的下載鏈接提供的Topshelf 1.0 RC二進制文件。 我已經嘗試了最新版本(29/07/2010),以及可從谷歌代碼和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#編譯器為我配置的一個或多個lambda生成的匿名類型。

是否有其他人使用ConfigureServiceInIsolation()看到此問題? 如果沒有,有誰知道我在這里缺少什么? 如果您需要更多信息,請告訴我,例如堆棧跟蹤或更多代碼。

如果您只在主機內使用一項服務,我會刪除“InIsolation”。 它不能正常工作,但在TopShelf的未來版本中(我們正在研究它)我認為我們有更好的答案來解決這個問題。 除了能夠在主機中刪除文件並在新的AppDomain中自動啟動服務之外。

我會說這屬於一個已知問題,除非有令人信服的理由使用InIsolation暫時避開它。 您無法跨應用程序域障礙編組lambda表達式,因此您遇到的問題。 如果InIsolation問題非常重要,我可以在計划發布最新版本之前研究解決這個問題與時間表的關系。 [你可以抓住最新的開發者。 來自這里的位: http//github.com/legomaster/Topshelf-警告,我們仍在積極開發中,但我認為所有主要的錯誤現在都被壓扁了]。

如果您想進一步討論這個問題,最簡單的方法是在所有開發人員都在觀看的MassTransit列表中發帖: http ://groups.google.com/group/masstransit-discuss

我希望這有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM