【发布时间】:2014-09-13 18:47:13
【问题描述】:
我有以下代码的实例,它可以在 Debug 中正确执行或作为独立的 Windows 应用程序执行:
TcpListener tcpListener = new TcpListener(IPAddress.Any, 4554);
tcpListener.Start();
while (true)
{
try
{
using (Socket socket = tcpListener.AcceptSocket())
{
// Code here is reached in Debug or as a Console Application
// but not as a Windows Service
}
}
catch (SocketException se)
{
// This is never reached
}
catch (Exception ex)
{
// This is never reached
}
finally
{
// This is never reached in the Windows Service
}
}
但是,当我将它安装为 Windows 服务时,它在 tcpListener.AcceptSocket() 上崩溃,并将以下内容记录到事件查看器:
MyService.exe [768] 中发生未处理的异常 ('System.Net.Sockets.SocketException')。即时调试此异常失败并出现以下错误:不支持尝试的操作。
即使试图捕获异常,我也无法再记录任何内容。在 Debug 中单步执行代码没有任何效果,因为代码成功阻止了应用程序并等待客户端连接。
有没有办法为 Windows 服务实现这一点?
【问题讨论】:
-
很可能是
Start正在抛出SocketException。由于它不在您的尝试中,因此您的捕获和最终没有被击中。将您的Start移动到您的 try 中,并在您的 catch 语句中检查您的SocketException的 ErrorCode 属性。这将使您更好地了解问题所在。然后对照 this list 检查 ErrorCode 以查看确切的问题。 -
让自己熟悉如何调试服务。这是可能的。
-
@vcsjones 我试过了,结果相同。我还在
tcpListener.AcceptSocket()之前和之后添加了日志记录,它在调用之前成功记录但不是之后。 -
谢谢@usr。我按照您的建议做了,发现我的服务逻辑正在重新实例化该类。
标签: c# sockets windows-services tcplistener