问题:
有一个测试服务器,我有一堆自动测试脚本,用于测试托管在单独的应用程序服务器上的Web应用程序。
为了完全自动化,我开发了一个C#应用程序,它扮演执行引擎(称为TAMS)的角色。因此,在每轮部署之后,测试人员可以让这个应用程序运行并等待结果(不再需要动手)。但最终目标是在成功部署之后立即通过构建服务器启动应用程序。
所以我的方法是:
构建服务器(Jenkins)向承载我的应用程序(执行引擎)的测试服务器发送REST请求,我的应用程序将执行测试脚本,最后将摘要发送回构建服务器。
由于所有三个服务器(构建服务器,应用程序服务器和测试服务器)在物理上是分开的,我提出了以下实现方法:
实现:
有一个使用Windows服务的Web API Self-Hosting,等待包含参数的REST(get)请求。
收到请求后,它应该在同一台机器上启动一个应用程序(具有UI)。
我的UI应用程序没有运行,它应该被Web API唤醒(作为Windows服务)。
所以我的解决方案采取以下步骤:
1)客户输入以下示例网址:
http://myserver:8080/values/GetString/[ProjectName]
2)Web API Self-Hosting接收请求
3)ValuesController(GetString)负责启动Windows应用程序并将“projectName”值传递给它。
除了启动应用程序之外,一切正常(每次调用都没有任何反应,尽管在客户端我获得了预期的返回虚拟消息,没有异常!)。我想知道我可能错过了控制器内进程调用的好习惯! p.s:在常规的Windows应用程序中,我可以使用控制器内的代码成功启动我的应用程序。
任何帮助都非常感谢!
这里是valuesController(ValuesController.cs):
using System;
using System.Web.Http;
using System.Web.Http.SelfHost;
using System.Diagnostics;
namespace WinService_TAMS_GatewayWebAPI
{
public class ValuesController : ApiController
{
public string GetString(string projectName)
{
Process.Start(@"C:\myApp\bin\Debug\myApp.exe", projectName);
return projectName + "got launched!";
}
}
}
这里是selfHost.cs内容,充当要托管的Windows服务:
public partial class SelfHost : ServiceBase
{
public SelfHost()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
var config = new HttpSelfHostConfiguration("http://localhost:8080");
config.Routes.MapHttpRoute(
name: "API",
routeTemplate: "{controller}/{action}/{projectName}",
defaults: new { projectName = RouteParameter.Optional }
);
HttpSelfHostServer server = new HttpSelfHostServer(config);
server.OpenAsync().Wait();
}
已编辑:serviceProcessInstaller的帐户为 LocalSystem