У меня есть консольное приложение с размещенным 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, установлены все актуальные обновления.
Любая помощь будет высоко оценена
Большое спасибо за первый быстрый ответ
Фреди