C#.NET 4.5 Visual Studio 2010
这更像是一次思考练习,而不是校对我的代码。
我正在开发一个在Windows中作为服务运行的HTTP侦听器。我使用下面的代码创建了一个独立的Windows窗体项目,它工作正常。每次请求进来时,我都能够显示一个消息框,显示HTTP POST请求的正文。
问题是,相同的代码在复制到后台服务DLL项目时,并没有“捕获”#34;发送给它的HTTP请求。这在我用于调试的日志文件中很明显(请参阅下面代码中对Log.Write()
的调用)。
我在同一台PC上运行这一切,所以我不认为问题在于端口正在使用,或者我使用的是错误的IP。
我想知道HTTP侦听器是否无法正常工作,因为它是后台服务,或者可能是因为它是DLL。
出于安全原因,下面的IP地址更改为1.2.3.4。
class http_listener
{
bool _stop;
main ()
{
_stop = false;
// start ListenForEvents() in new thread
// [code omitted]
}
private void ListenForEvents(object o)
{
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 IS written to log every 2 seconds");
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");
Socket socket = (Socket)begAcceptResult.AsyncState;
byte[] buf;
int bytesTransferred;
Socket endSocket = socket.EndAccept(out buf, out bytesTransferred, begAcceptResult);
string stringTransferred = Encoding.ASCII.GetString(buf, 0, bytesTransferred);
Log.Write(stringTransferred);
}
}
答案 0 :(得分:0)
搞定了。出于某种原因,当我将服务器作为服务运行时,我想要使用的端口被Windows防火墙阻止,但是当我将服务器作为Forms应用程序运行时,它并没有阻止它。该服务在防火墙设置中列出了一个例外,但该例外仅允许在一个特定端口上进行通信;不是我想要使用的那个。
以下是我更改为允许在我的端口上进行通信的设置:
控制面板> Windows防火墙>高级设置>入境规则> (右键单击服务名称)>属性> "协议和端口"标签>本地端口>将8000添加到已经列在那里的端口