问题
I have an console-app with hosted WebAPI (HttpSelfHostServer).
In the console-app I have Controllers that query data from SQL-Server.
The console-app works without problems (from fiddler and a Windows_client) Now I want to host the WebAPI (HttpSelfHostServer) in a Windows-Service.
Therefore I have created a Service-Project and referenced the Controllers in console-app-dll so that the controllers should be found.
To have a minimal chance to debug, I write some information in the event log from the windows service.
I can start and stop the windows-service without problems. It also seems as that the httpselfhost is started and active.
Problem: - By first attempt to the url, the service crashes hard with:
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()
I have tried for days to solve the problem, and I am desperate.
As I am not able to debug the service, I don't know where exactly the crash occurs.
I think, the start of the self-host in the windows-service works and the host also is reachable (as it crashes by first access).
So.. maybe I did something completely wrong in the service or I missed something important..
As the console-app works without problems, I post in the following only the code from the windows-service: Code to Windows-Service:
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("Service@matso.ch")
msg.To.Add("fredy.wenger@matso.ch")
msg.Subject = cMsg
msg.Body = cMsg
SMTPMail.Send(msg)
End Sub
End Class
I'm working with VS2013, VB.NET and Win 8.1.
The .net RunTime is installed, all actual updates are installed.
Any help will highly appreciated
Thanks a lot for a first fast answer
Fredy
回答1:
Answering very late to your answer, but still thought it might be useful to you.
You are hosting the server inside using, which will be disposed immediately after the method execution. Try to remove the below statement and that would resolve your problem.
Using server As New HttpSelfHostServer(config)
来源:https://stackoverflow.com/questions/24805600/hosting-webapi-in-windows-service-crashes-on-first-attempt