C# HttpLisenter启动方法在windows服务启动时失败

C# HttpLisenter启动方法在windows服务启动时失败,c#,windows-services,httplistener,C#,Windows Services,Httplistener,我一直在玩弄HttpListener的东西,在: 它在一个标准的控制台应用程序上工作得很好,但我正试图让它作为一个windows服务工作。应用程序日志显示,当服务启动时,它在HttpListener.Start()方法上失败。我很不明白为什么会发生这种情况 这是课程(这里是概念验证质量:) 错误: Faulting application name: Stout.Workers.Service.exe, version: 0.0.0.0, time stamp: 0x50d0cd99 Faul

我一直在玩弄HttpListener的东西,在:

它在一个标准的控制台应用程序上工作得很好,但我正试图让它作为一个windows服务工作。应用程序日志显示,当服务启动时,它在HttpListener.Start()方法上失败。我很不明白为什么会发生这种情况

这是课程(这里是概念验证质量:)

错误:

Faulting application name: Stout.Workers.Service.exe, version: 0.0.0.0, time stamp: 0x50d0cd99
Faulting module name: KERNELBASE.dll, version: 6.2.9200.16451, time stamp: 0x50988950
Exception code: 0xe0434352
Fault offset: 0x00014b32
Faulting process id: 0x1e70
Faulting application start time: 0x01cddd5bb3e8500b
Faulting application path:     C:\Users\Chad\Dropbox\Personal\Projects\Stout\Stout\Workers\Service\bin\Debug\Stout.Workers.Service.exe
Faulting module path: C:\Windows\SYSTEM32\KERNELBASE.dll
Report Id: f1aa9986-494e-11e2-be9b-685d43b0551c
Faulting package full name: 
Faulting package-relative application ID: 
信息:


我猜您正在尝试接受侦听器上的多个请求。 如果仔细阅读代码,您会发现您正在实例化无限多个侦听器,而不是创建一个侦听器来处理多个调用

您实际得到的异常是StackOverflowException(唯一无法用
try catch
块捕获的异常),无论您做什么,应用程序都会中断

删除
while
循环(只需调用Listen一次),并尝试在Listen方法中使用以下方法

HttpListener listener = new HttpListener();
//add your prefixes here
listener.Start();
AsyncCallback processRequest = delegate(IAsyncResult result)
{
    //set the listener to listen for next request
    listener.BeginGetContext(processRequest, listener);
    HttpListenerContext context = listener.EndGetContext(result);
    //Your code to handle the request here
}

listener.BeginGetContext(processRequest, listener);
这将使用单个
HttpListener

希望这有帮助

更新:如果取消对请求处理代码的注释,您将注意到不会发生异常,因为您在调用
listener.GetContext()
时阻塞了线程,并且侦听器将挂起,直到收到请求且Listen方法不返回为止。只要调用
listener.Start()
,它立即返回,然后返回true,您就可以以非常快的速度循环创建许多侦听器


您的代码可能以这种方式工作,但效率很低,因为您必须为每个请求创建一个侦听器。最好让一个侦听器异步处理所有请求,因为如果您的一个请求需要10秒来执行,那么在您响应请求的客户端之前,循环不会创建另一个侦听器。

您可以尝试添加一个try/catch并记录您收到的完整错误(message+stacktrace)吗?您可以在应用程序开始时将eventhandler添加到
AppDomain.CurrentDomain.UnhandledException
事件中,以便在退出应用程序之前尝试捕获并记录错误。这个问题可能是权限问题,因为windows服务似乎不是在通过命令行执行的相同用户帐户下运行的,但是没有确切的错误,我只是猜测您记录的是CLR由于未处理的异常而终止您的服务。很难猜测您是如何在控制台应用程序中使用此代码的。别忘了在Main方法中添加Console.ReadLine(),这样线程就有足够的时间以同样的方式使你的应用程序崩溃。@BernhardKircher我猜这是一个权限问题,尽管我无法让它工作(或者在errors/stacktrace中吐出任何更有用的东西)。由于这只是我的一个小型个人项目,我已经放弃了通过窗口服务来完成这项工作,而是使用一个很好的旧winform应用程序;)
Faulting application name: Stout.Workers.Service.exe, version: 0.0.0.0, time stamp: 0x50d0cd99
Faulting module name: KERNELBASE.dll, version: 6.2.9200.16451, time stamp: 0x50988950
Exception code: 0xe0434352
Fault offset: 0x00014b32
Faulting process id: 0x1e70
Faulting application start time: 0x01cddd5bb3e8500b
Faulting application path:     C:\Users\Chad\Dropbox\Personal\Projects\Stout\Stout\Workers\Service\bin\Debug\Stout.Workers.Service.exe
Faulting module path: C:\Windows\SYSTEM32\KERNELBASE.dll
Report Id: f1aa9986-494e-11e2-be9b-685d43b0551c
Faulting package full name: 
Faulting package-relative application ID: 
Fault bucket , type 0
Event Name: CLR20r3
Response: Not available
Cab Id: 0

Problem signature:
P1: stout.workers.service.exe
P2: 0.0.0.0
P3: 50d0cd99
P4: System
P5: 4.0.30319.18016
P6: 505702c9
P7: 206c
P8: 5c
P9: System.Net.HttpListenerException
P10: 
HttpListener listener = new HttpListener();
//add your prefixes here
listener.Start();
AsyncCallback processRequest = delegate(IAsyncResult result)
{
    //set the listener to listen for next request
    listener.BeginGetContext(processRequest, listener);
    HttpListenerContext context = listener.EndGetContext(result);
    //Your code to handle the request here
}

listener.BeginGetContext(processRequest, listener);