我有一个使用HttpListener的应用程序,我需要知道客户端何时断开连接,现在我将所有代码都放在try / catch块中,这很丑陋,不是一个好习惯。
我怎么知道客户端是否断开连接?
谢谢!
简短回答:您不能。如果客户停止通话,则底层套接字可能会保持打开状态,并且永远不会关闭;它只会超时。检测到此问题的方法是尝试对该连接执行操作,如果该连接不再有效,则它将根据发生的情况抛出某种异常。如果您异步使用HttpListener,则可能会通过try / catch清理代码,但不幸的是,这就是您所坚持的。如果客户端断开连接,则不会触发任何事件。
我遇到同样的问题,我执行了很长的sql查询,如果用户不断按F5,它会崩溃。
HttpListener不会公开其底层套接字,因此可以对其进行轮询。
所以我设法解决了这个问题:
IDbCommand cmd = LongSqlQuery();
while (!taskCompleted)
{
try
{
//send disposable data at times to check connection
byte[] dummy = new byte[1] { 0xFF };
outputStream.Write(dummy,0,1);
Task.Delay(100).Wait();
}
catch
{
//Client disconnect
cmd.Cancel();
}
}
//Redirect client to results page
response.Redirect("http://yourserver.com/results?query=yourquery");