C# 为什么我的HTTP侦听器程序作为Windows窗体项目工作,而不在Windows服务中工作?
我使用套接字创建了一个简单的异步服务器,它侦听HTTP请求,并在每次收到某个IP地址和端口上的请求时调用函数C# 为什么我的HTTP侦听器程序作为Windows窗体项目工作,而不在Windows服务中工作?,c#,sockets,service,C#,Sockets,Service,我使用套接字创建了一个简单的异步服务器,它侦听HTTP请求,并在每次收到某个IP地址和端口上的请求时调用函数RequestCallback() 当我在Windows窗体项目中运行它时,它会工作,但当我将代码添加到Windows服务项目中时,它会运行,但不会调用RequestCallback()。请参阅下面对Log.Write()的两个调用 该服务作为网络服务运行(服务>登录为=“网络服务”),我无法更改此设置;这是由客户决定的。我尝试暂时将服务更改为以本地用户身份登录,但第二条log语句仍然没有
RequestCallback()
当我在Windows窗体项目中运行它时,它会工作,但当我将代码添加到Windows服务项目中时,它会运行,但不会调用RequestCallback()
。请参阅下面对Log.Write()
的两个调用
该服务作为网络服务运行(服务>登录为=“网络服务”),我无法更改此设置;这是由客户决定的。我尝试暂时将服务更改为以本地用户身份登录,但第二条log语句仍然没有编写
class http_listener
{
bool _stop;
main ()
{
_stop = false;
_eventListenerThread = new Thread(ListenForEvents);
_eventListenerThread.Name = "Event listener thread";
_eventListenerThread.Start();
}
private void ListenForEvents()
{
Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
System.Net.IPAddress ipAddress = System.Net.IPAddress.Parse("1.2.3.4");
System.Net.EndPoint endPoint = new System.Net.IPEndPoint(ipAddress, 8000);
_socket.Bind(endPoint);
_socket.Listen(1000);
while (!_stop)
{
Log.Write("this shows up in log every 2 seconds, even when run as service");
Thread.Sleep(2000);
_recvBufSize = 1000; // max bytes to recieve
_begAcceptResult = _socket.BeginAccept(null, _recvBufSize, new AsyncCallback(RequestCallback), _socket);
}
_eventListenerThread = null;
}
private void RequestCallback(IAsyncResult begAcceptResult)
{
Log.Write("this is NOT written to log when run as service");
Socket socket = (Socket)begAcceptResult.AsyncState;
// write request packet to log
byte[] buf;
int bytesTransferred;
Socket endSocket = socket.EndAccept(out buf, out bytesTransferred, begAcceptResult);
string stringTransferred = Encoding.ASCII.GetString(buf, 0, bytesTransferred);
Log.Write(stringTransferred);
}
}
让它工作起来。由于某些原因,当我将服务器作为服务运行时,该端口被Windows防火墙阻止,但当我将服务器作为窗体应用程序运行时,该端口未被阻止 以下是我更改的设置:
控制面板>Windows防火墙>高级设置>入站规则>(右键单击服务名称)>属性>“协议和端口”选项卡>本地端口>将8000添加到已列出的端口中第一次从visual studio运行时,很可能会弹出一个请求允许的弹出窗口,很明显,你不会从服务中得到这些。还要注意的是,
HTTPListener
是一个真实的东西,这让我有一秒钟的紧张。