【问题标题】:Self terminating Self-hosted WebAPI自终止自托管 WebAPI
【发布时间】:2013-07-09 15:51:26
【问题描述】:

我有一个自托管 ASP.Net WebAPI 的控制台应用程序。我希望控制台应用程序根据对 WebAPI 的特定调用自行终止。

控制台应用很大程度上基于此处找到的示例 -> http://www.asp.net/web-api/overview/hosting-aspnet-web-api/self-host-a-web-api

提供一些上下文;

控制台应用程序将与 Jenkins CI 结合使用,以自动执行 Android 应用程序的 BDD 测试。 Jenkins 将负责构建、安装和启动一个 Android 应用程序——然后它将调用这个控制台应用程序。 Android 应用程序将运行一系列 Jasmine BDD 测试,通过控制台应用程序/WebAPI 自动将更新返回给 Jenkins。测试完成后,Android 应用将调用特定的 WebAPI 操作 - 此时我希望它终止控制台应用,以便 Jenkins 进入下一个构建步骤。

提前致谢。

【问题讨论】:

    标签: c# asp.net-web-api console-application


    【解决方案1】:

    只需使用ManualResetEvent。在您的 Program 类中,添加一个静态公共字段:

    public static System.Threading.ManualResetEvent shutDown =
           new ManualResetEvent(false);
    

    然后在你的主要方法中:

    config.Routes.MapHttpRoute(
        "API Default", "api/{controller}/{id}", 
        new { id = RouteParameter.Optional });
    
    using (HttpSelfHostServer server = new HttpSelfHostServer(config))
    {
        server.OpenAsync().Wait();
        //Console.WriteLine("Press Enter to quit.");
        //Console.ReadLine();
        shutDown.WaitOne();
    }
    

    然后在相应的 API 方法中:

    Program.shutDown.Set();
    

    当你的 main 方法退出时,程序将停止。

    【讨论】:

    • 如果在API方法中设置了这个关闭开关,它会发送正确的响应吗?看起来程序将立即停止,但当前正在处理的所有请求会发生什么情况?
    • @eXist - 关闭进程的同时实际上平稳地处理正在进行的请求是存在诸如 IIS 之类的系统的原因。他们处理创建新流程以迎合新请求,并且在对正在进行的请求进行排序之前不拆除旧流程。如果您走自己的路,则必须自己构建基础架构。
    【解决方案2】:

    要关闭正常的 .Net 应用程序,您可以使用:

    System.Environment.Exit(0)
    

    MSDN

    【讨论】:

    • 在我看来,这是最后的解决方案。 Damien 的方法将允许在退出之前进行适当的清理(例如,干净地关闭其他线程),而这种解决方案更像是 Wail and Bail。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2018-05-04
    • 2015-10-06
    • 1970-01-01
    • 2020-11-22
    相关资源
    最近更新 更多