1

我正在尝试将自托管的可执行文件作为 Windows 服务运行。我正在使用 MVC 4 beta Web API。首先,我使用Derik Whittaker 的博客来设置基本的控制台应用程序,并对其进行了测试,得到了积极的结果。

然后,我使用Einar Egilsson 的博客将其作为控制台应用程序和 Windows 服务运行。作为服务安装的应用程序就好了。我将服务登录设置为使用我自己的进行此基本测试;如果没有这个,它就无法绑定到套接字。当服务启动时,我按预期看到所有跟踪日志,没有致命错误。该应用程序似乎运行正常。当我使用 fiddler 对控制台应用程序使用相同的请求进行测试时,我收到“HTTP/1.1 500 内部服务器错误”。

当我关闭服务然后在 VS 中使用 F5 启动时使用相同的代码,应用程序启动得很好并提供相同的请求!?日志条目在相同的执行路径中是相同的。

public partial class TestService : ServiceBase {
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    private HttpSelfHostServer _server;

    static void Main(string[] args) {
        Logger.Debug("Main Called");
        var service = new TestService();
        if (Environment.UserInteractive) {
            Logger.Debug("Environment.UserInteractive == true");
            Console.WriteLine("Press any key to stop program");
            service.OnStart(args);
            service.OnStop();
        } else {
            Logger.Debug("Environment.UserInteractive == false");
            try {
                Run(service);
            } catch(Exception exception) {
                Logger.Fatal(exception.Message, exception);
            }
        }
    }

    protected override void OnStart(string[] args) {
        Logger.Debug("OnStart called");
        var hostUri = string.Format("http://{0}:{1}", Environment.MachineName, ConfigurationManager.AppSettings["Service.Port"]);
        Logger.Debug("URL:" + hostUri);
        var selfHostConfiguration = new HttpSelfHostConfiguration(hostUri);
        selfHostConfiguration.Routes.MapHttpRoute(
            name: "DefaultApiRoute",
            routeTemplate: "endpoints/{controller}",
            defaults: null
            );
        Logger.Debug("Routes registered");
        try {
            using (_server = new HttpSelfHostServer(selfHostConfiguration)) {
                Logger.Debug("Hosting at " + hostUri + "/endpoints/{controller}");
                _server.OpenAsync().Wait();
                if (Environment.UserInteractive) { // *** I've tried this commented out as well
                    Console.ReadLine();
                }
                Logger.Debug("End of using");
            }
        } catch(Exception exception) {
            Logger.Fatal(exception.Message, exception);
            if(exception.InnerException != null) {
                Logger.Fatal(exception.InnerException.Message, exception.InnerException);
            }
        }
    }

    protected override void OnStop() {
        _server.Dispose();
    }
}
4

3 回答 3

1

自从您发布此内容以来已经有一段时间了,但我想输入。

我不知道这是为什么,但是内部错误来自于在 onStart 方法中初始化 self 主机。您必须在服务的构造函数中对其进行初始化,然后仅在 onStart 方法中调用 _server.OpenAsync()。

或者至少这对我有用。

于 2012-04-19T18:41:09.220 回答
0

使用 TopShelf。我刚刚写了一篇关于如何做到这一点的博客。

于 2012-03-30T17:34:05.730 回答
0

如我所见,您_server.OpenAsync().Wait();在 OnStart 方法中使用。这只会使您的初始化代码冻结,该行之后的所有代码都不会执行。为避免这种情况,请尝试从 OpenAsync() 中删除 .Wait()。

于 2012-08-07T15:39:05.127 回答