Новый веб-API MVC 4 Beta не обслуживает запросы при запуске в качестве службы Windows - PullRequest
1 голос
/ 13 марта 2012

Я пытаюсь запустить собственный исполняемый файл в качестве службы Windows. Я использую бета-версию MVC 4 Web API. Сначала я использовал блог Дерика Уиттакера для настройки основного консольного приложения и протестировал его с положительными результатами.

Затем я использовал блог Эйнара Эгильссона , чтобы он работал как консольное приложение и служба Windows. Приложение установлено как сервис просто отлично. Я настроил вход в службу, чтобы использовать свой собственный для этого базового тестирования; без этого он не смог привязаться к сокету. Когда служба запускается, я вижу все свои журналы трассировки, как и ожидалось, нет фатальных ошибок. Приложение работает нормально. Когда я тестирую с использованием fiddler, используя тот же запрос для консольного приложения, я получаю «HTTP / 1.1 500 Internal Server Error».

Используя этот же код, когда я отключаю службу, а затем запускаю с помощью F5 в VS, приложение запускается нормально и выполняет тот же запрос !? Записи журнала идентичны в одних и тех же путях выполнения.

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();
    }
}

Ответы [ 3 ]

1 голос
/ 19 апреля 2012

Прошло некоторое время с тех пор, как вы опубликовали это, но я хотел ввести.

Я не знаю, почему это так, но внутренняя ошибка возникает из-за инициализации собственного хоста внутри метода onStart.Вы должны инициализировать его в конструкторе службы, а затем вызывать только _server.OpenAsync () в методе onStart.

Или, по крайней мере, это то, что сработало для меня.

0 голосов
/ 07 августа 2012

Как я вижу, вы используете _server.OpenAsync().Wait(); в методе OnStart. Это просто заставляет ваш код инициализации зависать, весь код после этой строки не будет выполняться. Чтобы избежать этого, попробуйте удалить .Wait () из OpenAsync ().

0 голосов
/ 30 марта 2012

Используйте TopShelf. Я только что написал о , как это сделать .

...