有一个ATL的COM组件,会被asp页面调用,组件方法中有一个耗时很长的操作,现在想在这个耗时的操作中循环检查asp页面中的Response对象IsClientConnected方法,如果检查到用户已断开了与服务器的连接就停止操作并返回,但问题是即使页面处理过程中关掉浏览器,每次检查IsClientConnected属性也都返回真,结果就是这个方法会一直运行下去直到结束,而用户在此过程中对系统中其他页面的访问也都会被阻塞,不知道是哪里出了问题代码如下:STDMETHODIMP CCommandTest::Test(...)
{
LOG("begin check");

for (int i=0; i<10; ++i) {
CComPtr<IObjectContext> pObjContext;
if (SUCCEEDED(GetObjectContext(&pObjContext))) {
CComQIPtr<IGetContextProperties> pGcp(pObjContext);
if (pGcp != 0) {
CComVariant v;
if (SUCCEEDED(pGcp->GetProperty(L"Response", &v))) {
CComDispatchDriver drv(v.pdispVal);
CComVariant v;
if (SUCCEEDED(drv.GetPropertyByName(L"IsClientConnected", &v))) {
if (v.boolVal == VARIANT_TRUE) {
LOG("    client is still connected"); // 每次都运行到这里
}
else {
LOG("    CLIENT DISCONNECTED!!");
break;
}
}
}
}
}
Sleep(1000);
}

LOG("end check");
return S_OK;
}

解决方案 »

  1.   

    用户是否断开与服务器的连接如果在response中检查,那么客户端应该向服务器发出这样的消息啊?
    如果用户与服务器之间的连接在服务器端是时时显示的,这样不符合实际网络的运行情况吧,我想这个时候
    应该是客服端主动的去向服务器端发送断开的信息,或者是采用服务器轮询的方式。
    第一种方式我想,如果你使用过工商银行网上银行的话就知道了,在每次退出工商银行网页的时候,它都会弹出一个
    确认框,我想这个确认框就是在客户端发送退出登录信息的时候出现的。
    第二种方式估计会消耗很大的资源,对服务器来说也不好。
    这两种情况我想都应该是在控件的参与下才能完成的,不管是客户端还是服务器端都需要有响应的控件来执行这种检查操作。
      

  2.   

    客户端浏览器是会向服务器发出请求以获取页面内容的啊,这个请求有超时限制的,默认是90秒钟(Server.ScriptTimeout)Response.IsClientConnected好像在asp的代码中是可以使用的,比如在一段耗时的数据库访问代码中加入一些检查的代码以确定客户浏览器还在连接状态(还没有超出90秒的默认超时限制),但奇怪的是这个检查放到COM里面做就不行了