- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Topshelf托管用 C# 编写的 Windows 服务,我现在想编写一些集成测试。我的初始化代码保存在如下启动器类中:
public class Launcher
{
private Host host;
/// <summary>
/// Configure and launch the windows service
/// </summary>
public void Launch()
{
//Setup log4net from config file
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(DEFAULT_CONFIG));
//Setup Ninject dependency injection
IKernel kernel = new StandardKernel(new MyModule());
this.host = HostFactory.New(x =>
{
x.SetServiceName("MyService");
x.SetDisplayName("MyService");
x.SetDescription("MyService");
x.RunAsLocalSystem();
x.StartAutomatically();
x.Service<MyWinService>(s =>
{
s.ConstructUsing(() => kernel.Get<MyWinService>());
s.WhenStarted(w => w.Start());
s.WhenStopped(w => w.Stop());
});
});
this.host.Run(); //code blocks here
}
/// <summary>
/// Dispose the service host
/// </summary>
public void Dispose()
{
if (this.host != null && this.host is IDisposable)
{
(this.host as IDisposable).Dispose();
this.host = null;
}
}
}
我想编写一些集成测试以确保正确设置 log4net 和 Ninject 以及 Topshelf 启动我的服务。问题是,一旦您在 Topshelf 主机上调用 Run()
,代码就会阻塞,因此我的测试代码永远不会运行。
我想在测试的 SetUp
部分的单独线程中调用 Launch()
,但我需要一些 hack 来放入 Thread.Sleep(1000)
以确保测试不会在 Launch()
完成之前运行。我无法对其使用适当的同步(如 ManualResetEvent
),因为 Launch()
永远不会返回。目前的代码是:
private Launcher launcher;
private Thread launchThread;
[TestFixtureSetUp]
public void SetUp()
{
launcher = new Launcher();
launchThread = new Thread(o => launcher.Launch());
launchThread.Start();
Thread.Sleep(2500); //yuck!!
}
[TestFixtureTearDown]
public void TearDown()
{
if (launcher != null)
{
launcher.Dispose(); //ouch
}
}
理想情况下,我正在寻找一种启动服务的非阻塞方式和一种再次停止它以放入我的TearDown
的编程方式。目前,我的 TearDown
只是处理了启动器(所以 TearDown
真的把它拆掉了!)。
有没有人有用这种方式测试Topshelf服务的经验?我可以使用标准 ServiceHost
相对轻松地完成上述操作,但我更喜欢 Topshelf 中的显式配置和易于安装。
最佳答案
https://github.com/Topshelf/Topshelf/blob/v2.3/src/Topshelf/Config/Builders/RunBuilder.cs#L113我想这就是你想要的。 AfterStartingService
可用于从不同线程设置 ManualResetEvent
。
现在这可能适合您,但这感觉过于复杂并且可以通过部署到开发/暂存并对您的系统进行冒烟测试来验证。但是,如果不更多地了解您的环境,这可能是不可能的。
关于c# - 使用 Topshelf 进行集成测试以启动 C# Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11742281/
我将 Topshelf 与 FluentSchedule 结合用于 Windows 服务。 但是,我希望能够试运行应用程序以简单地启动而不执行设置计时器等的 FluentSchedule 代码。 从命
如何让 Topshelf 作为特定域用户帐户运行?我在配置 x.RunAs("domain\username", "password"); 我在代码中有一个控制台语句,它打印出进程正在运行的 Wind
我有几个在特定服务帐户下运行的 Topshelf 服务。如果我从命令行手动安装服务,我可以使用 --interactive 标志,然后会出现一个对话框,允许我输入用户名和密码。我希望能够通过 Powe
我对搁置的 Topshelf 有疑问服务没有按预期启动:即使 shelf 文件夹发生变化,并且 Topshelf 注意到了这一点,服务也没有启动。没有显示错误消息(实际上根本没有日志消息),我真的不知
我正在尝试使用 Topshelf 将控制台应用程序托管为 Windows 服务,但我遇到了问题... 我已经从我的控制台应用程序中引用了 Topshelf dll 以及 log4net dll。但是,
我开发了一个连接到 RabbitMQ 然后处理一些消息的控制台应用程序。我正在使用 Topshelf 允许作为服务执行而没有(在纸上)问题,但是当我将它作为服务运行时,我得到以下异常 Applicat
我有一项使用 TopShelf 的服务。现在我想用 Octopusdeploy 安装该服务,但我无法让它工作。当我尝试启动服务时,触手似乎挂了。 Deploy.ps1 看起来像: $cmd = "$O
有没有人在构建 Windows 服务时使用过 TopShelf? 我在尝试启动服务时一直遇到这个错误, “尚未安装 Topshelf.HostConfigurators.WindowsServiceD
我正在尝试使用 TopShelf 创建 Windows 服务。使用该服务的一个实例,一切正常。但是,当我将整个服务文件夹复制到不同的位置,然后在该位置运行安装时,它只是卡在“启动”上。 我根据配置文件
我已经为示例 tvOS 应用程序设置了顶层,但单击顶层项目不会启动该应用程序。我已经设置了显示 URL,但我不确定我是否做得对……有人确切知道如何做到这一点吗? 最佳答案 您可能错过了 .plist
我构建了 Topshelf 示例应用程序(版本 4.0.1),该应用程序具有仅写入控制台的 TimedEvents。可以以管理员身份安装和运行。作为 NetworkService 安装时(尝试以较少的
基于 this question 处的样本它处理将自定义参数传递给 Topshelf,我现在希望能够干净地退出 Topshelf HostFactory。 我有以下代码,它确实有效,但当它“返回”时,
我制作了一个使用自定义参数的 topshelf 网络服务: string department = null; // *********************Below is a TopShelf
我最近发现了 TopShelf。从我读过的所有内容来看,它看起来非常酷。唯一的问题是我无法使用它。我一定是错过了什么。下面是我的代码。 using System; using System.Colle
注意:我没有做任何类似于 Topshelf installer requires me to press enter twice - why? 的事情 服务类(有趣的部分): public class
我正在使用 Topshelf 创建 Windows 服务。此服务将尝试恢复前 3 次失败,但之后,它就不再工作了。 检查主机上服务中的服务显示: First Failure: Res
通常对于服务,您要完成的任务是重复的,可能是在循环中,也可能是触发器或其他东西。 我正在使用 Topshelf为我完成一项重复的任务,特别是我正在使用 Shelf'ing 功能。 我遇到的问题是如何处
正如 TosShelf 所说: “您只能拥有一项服务!从 3.x Topshelf 开始,基础产品不再支持托管多项服务。” 从版本 3.x 开始,我需要弄清楚如何集成新版本的 Topshelf。 问题
我正在使用 Topshelf 托管 Windows 服务。我希望让托管服务调用以在某些事件发生时重新启动。我想知道如何实现这一目标? 谢谢,本 最佳答案 当你想重启服务时调用Environment.E
我想问一下ConstructUsing中应该进行哪些操作,WhenStarted中应该进行哪些操作。事实上,通常放置在构造函数中的内容(例如配置读取、服务情况下的初始化)应该放置在 WhenStart
我是一名优秀的程序员,十分优秀!