在C#中通过Web API Self-Hosting(使用Windows服务)启动Windows应用程序

时间:2017-09-22 15:13:25

标签: c# rest asp.net-web-api windows-services

问题:
有一个测试服务器,我有一堆自动测试脚本,用于测试托管在单独的应用程序服务器上的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

0 个答案:

没有答案