Хостинг WebAPI в Windows-Service дает сбой при первой попытке

У меня есть консольное приложение с размещенным WebAPI (HttpSelfHostServer).

В консольном приложении у меня есть контроллеры, которые запрашивают данные с SQL-сервера.

Консольное приложение работает без проблем (от fiddler и Windows_client). Теперь я хочу разместить WebAPI (HttpSelfHostServer) в Windows-Service.

Поэтому я создал Service-Project и сослался на контроллеры в console-app-dll, чтобы контроллеры были найдены.

Чтобы иметь минимальную возможность отладки, я записываю некоторую информацию в журнал событий из службы Windows.

Я могу запускать и останавливать службу Windows без проблем. Также кажется, что httpselfhost запущен и активен.

Проблема: – При первой попытке URL-адреса служба аварийно завершает работу:

System.NullReferenceException (eventlog-entry to .net RunTime) 

Anwendung: WS_MatrixGuide.exe
Frameworkversion: v4.0.30319
Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.
Ausnahmeinformationen: **System.NullReferenceException**
Stapel:
   bei System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__5(System.Object)
   bei System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object)
   bei System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   bei System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   bei System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   bei System.Threading.ThreadPoolWorkQueue.Dispatch()
   bei System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

Я пытался в течение нескольких дней решить проблему, и я в отчаянии.

Поскольку я не могу отладить службу, я не знаю, где именно происходит сбой.

Думаю, запуск селф-хоста в windows-сервисе работает и хост тоже достижим (т.к. вылетает при первом доступе).

Так что.. может я что-то совсем не так сделал в сервисе или пропустил что-то важное..

Так как консоль-приложение работает без проблем, ниже выкладываю только код из windows-сервиса: Код для Windows-сервиса:

Imports System
Imports System.ServiceProcess
Imports System.ServiceModel
Imports KA_MatrixGuide.Controllers ' Verweis auf Controller in KA_MatrixGuide (Konsolenanwendung) erstellen
Imports System.Net.Mail
Imports System.Web.Http.SelfHost ' Self Hosting
Imports System.Web.Http
Imports System.IO
Public Class WS_MatrixGuide
    Private SH As ServiceHost
    Public Sub New()
        InitializeComponent()
        Me.ServiceName = "WS_MatrixGuide"
    End Sub
    Protected Overrides Sub OnStart(ByVal args() As String)
        EventLog.WriteEntry("Vor SH = new...", System.Diagnostics.EventLogEntryType.Information)
        SH = New ServiceHost(GetType(WS_MatrixGuide))
        AddHandler SH.Faulted, AddressOf SH_Faulted
       EventLog.WriteEntry("Vor Dim config...", System.Diagnostics.EventLogEntryType.Information)
        Dim config As New HttpSelfHostConfiguration("http://127.0.0.1:21212")
       EventLog.WriteEntry("Vor Config-Routes...", System.Diagnostics.EventLogEntryType.Information)
        config.Routes.MapHttpRoute( _
          name:="DefaultApi", _
          routeTemplate:="api/{controller}/{id}", _
          defaults:=New With {.id = RouteParameter.Optional} _
        )
        'Tracing-Info's in Event-Log schreiben...
        EventLog.WriteEntry("Vor Using Server...", System.Diagnostics.EventLogEntryType.Information)
        Using server As New HttpSelfHostServer(config)
            ' Objekte zu Controllern erstellen (Interface für Zugriff)
            Dim SQL_C As Type = GetType(KA_MatrixGuide.Controllers.SQLController)
            Dim Beauty_C As Type = GetType(KA_MatrixGuide.Controllers.BeautyController)
            Dim Freizeit_C As Type = GetType(KA_MatrixGuide.Controllers.FreizeitController)
            Dim Gourmet_C As Type = GetType(KA_MatrixGuide.Controllers.GourmetController)
            Dim Konfiguration_C As Type = GetType(KA_MatrixGuide.Controllers.KonfigurationController)
            Dim Empfehlungen_C As Type = GetType(KA_MatrixGuide.Controllers.EmpfehlungenController)
           Try
                EventLog.WriteEntry("Vor Server.OpenAsync...", System.Diagnostics.EventLogEntryType.Information)
                server.OpenAsync().Wait()
                EventLog.WriteEntry("Nach Server.OpenAsync...", System.Diagnostics.EventLogEntryType.Information)
            Catch aggEx As AggregateException
                EventLog.WriteEntry("Fehler beim Laden des Servers (httpSelfHostServer)...", System.Diagnostics.EventLogEntryType.Information)
            End Try
            'Console.WriteLine()
            'Console.WriteLine("Enter-Taste drücken, um die Konsolen-Anwendung zu beenden.")
            'Console.ReadLine()
            'AddHandler server.Faulted, AddressOf Server_Faulted ' => es gibt kein Server.Faulted
        End Using
        'EventLog.WriteEntry("WS_MatrixGuide wurde gestartet", System.Diagnostics.EventLogEntryType.Information)
        EventLog.WriteEntry("Vor SH.Open...", System.Diagnostics.EventLogEntryType.Information)
        SH.Open()
        EventLog.WriteEntry("Nach SH.Open...", System.Diagnostics.EventLogEntryType.Information)
    End Sub
    Protected Overrides Sub OnStop()
        Dim Infomeldung As String = "WS_MatrixGuide wurde gestoppt"
        EventLog.WriteEntry(Infomeldung, System.Diagnostics.EventLogEntryType.Information)
        SH.Close()
        SH = Nothing
    End Sub
    Private Sub SH_Faulted() ' Eigener Fehlerhandler
        Dim Fehlermeldung As String = "Fehler bei Ausführung von WS_MatrixGuide. Service wurde gestoppt"
        EventLog.WriteEntry(Fehlermeldung, System.Diagnostics.EventLogEntryType.Error)
       Dim cMsg As String = "Fehler bei der Ausführung von WS_MatrixGuide. Der Service wurde gestoppt."
        Dim SMTPMail As New SmtpClient
        SMTPMail.Host = "zrhms200" 
        SMTPMail.Port = 25 ' Standard-Port
        Dim msg As New MailMessage
        msg.From = New MailAddress("[email protected]") 
        msg.To.Add("[email protected]")
        msg.Subject = cMsg
        msg.Body = cMsg
        SMTPMail.Send(msg)
    End Sub
End Class

Я работаю с VS2013, VB.NET и Win 8.1.

Установлен .net RunTime, установлены все актуальные обновления.

Любая помощь будет высоко оценена

Большое спасибо за первый быстрый ответ

Фреди


person FredyWenger    schedule 17.07.2014    source источник


Ответы (1)


Отвечая очень поздно на ваш ответ, но все же подумал, что он может быть вам полезен.

Вы размещаете сервер внутри с помощью, который будет удален сразу после выполнения метода. Попробуйте удалить приведенное ниже утверждение, и это решит вашу проблему.

Using server As New HttpSelfHostServer(config)

person kumar106    schedule 24.09.2014
comment
Спасибо за ваш (к сожалению, слишком) поздний ответ. Тем временем я переписал сервис на Owin (и.. работает :-). Но в целом ваш ответ интересен... Дополнительный вопрос к вашему ответу: если я удалю оператор Using server..., как я могу получить доступ к серверу (server.OpenAsync().Wait)? Или вы имели в виду изменить Заявление (на Dim server как New HttpSelfHostServer(config)... или... что...)? Спасибо за ваше время - person FredyWenger; 25.09.2014
comment
Вы, сэр, только что решили мне МНОГО проблем!!! Я уже некоторое время ломаю голову над набором кода, который работал на консоли, но не на службе Windows :=) - person schizoid04; 27.09.2016