【问题标题】:New MVC 4 Beta Web API is not serving requests when ran as a Windows Service当作为 Windows 服务运行时,新的 MVC 4 Beta Web API 不服务请求
【发布时间】:2012-03-13 15:40:26
【问题描述】:

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

然后我使用Einar Egilsson's blog 使其既可用作控制台应用程序,又可用作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();
    }
}

【问题讨论】:

    标签: asp.net-mvc-4 windows-services asp.net-web-api self-hosting


    【解决方案1】:

    你发布这个已经有一段时间了,但我想输入。

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

    或者至少这对我有用。

    【讨论】:

      【解决方案2】:

      使用 TopShelf。我刚刚写了一篇关于 how to do that 的博客。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-13
          • 1970-01-01
          相关资源
          最近更新 更多