我做了一个网站(SiteA),首页有有请求推送部分的代码.如果我把这个代码注释掉,那么网站一直正常运行.如果没有被注释,那么网站运行一天(其中有很多人登陆),那么网站只能打开登陆页面,进不去.也没任何报错这个问题 就是把连接池(appA)删了 在新建一个连接池(appB) 把网站SiteA的连接池指向appB 就好用了.或者第二天自己就好了但是我也不能总这么干啊..出现这个问题 是不是推送部分的代码导致连接池满了?我该怎么解决?是在连接池里设置什么回收的?还是代码写 
    如果回收了 会不会导致session失效?我的session是在StateServer里的

解决方案 »

  1.   


    <script language="javascript" type="text/javascript">
            $(document).ready(function () {
                //加载时间
               function wait() 
               {
                   $.post("comet_broadcast.aspx", { content:"-1" }, 
                    function (data, status) 
                    {
                        //data格式为10004,10006@您有工作计划需要查阅@工作计划审批@../login.aspx
                        //分别为用户集合,描述,tab标题,路径 以下分别从消息里传入
                        var uid = data.split("@")[0];
                        var mg = data.split("@")[1];
                        var tab= data.split("@")[2];
                        var url= data.split("@")[3];
                        if (uid.indexOf($("#h1").val()) !=-1&&data.indexOf("@")!=-1 ) 
                        {
                          //有消息了,而且来自自己的
                               msgShow(mg,tab,url);
                       
                        }
                                         wait();
                    }, "html"
                    );
               }
               wait();
                
            });
        </script>
    -1的时候不做处理,只有别人发送消息的时候才推送数据 然后客户端显示
      

  2.   

    老兄,不要专牛角尖,基本上是达不到你想要的效果(起码我是没想到有啥好的方案来接管这个SOCKET连接),果断换方案。轮询
      

  3.   

    去掉你的wait(),用setInterval();
    <script type="text/javascript">
            $(document).ready(function () {
                //加载时间
                function wait() {
                    alert("1");
                    $.post("comet_broadcast.aspx", { content: "-1" },
                     function (data, status) {
                         //data格式为10004,10006@您有工作计划需要查阅@工作计划审批@../login.aspx
                         //分别为用户集合,描述,tab标题,路径 以下分别从消息里传入
                         var uid = data.split("@")[0];
                         var mg = data.split("@")[1];
                         var tab = data.split("@")[2];
                         var url = data.split("@")[3];
                         if (uid.indexOf($("#h1").val()) != -1 && data.indexOf("@") != -1) {
                             //有消息了,而且来自自己的
                             msgShow(mg, tab, url);
                         }
                     }, "html"
                     );
                }            setInterval(wait, 5000);        });
        </script>
      

  4.   


    这样就是轮询了? 但是这样子目测不行啊..我是推送 如果我推的那个时候 你没有连接 客户端怎么取数据??看下我发的http://bbs.csdn.net/topics/390346423差不多就是这个意思 
      

  5.   


    using System;
    using System.Collections.Generic;
    using System.Web;/// <summary>
    /// Summary description for Messages
    /// </summary>
    public class Messages
    {
        /// <summary>
        /// 记录所有请求的客户端
        /// </summary>
        List<myAsynResult> clients = new List<myAsynResult>();    #region 实现该类的单例
        private static readonly Messages _Instance = new Messages();
        private Messages()
        {
        }
        public static Messages Instance()
        {
            return _Instance;
        }
        #endregion    public void AddMessage(string content, myAsynResult asyncResult)
        {
            //content=content+clients.Count.ToString();
            //当传入的内容为"-1"时,表示为建立连接请求,即为了维持一个从客户端到服务器的连接而建立的连接
            //此时将该连接保存到 List<myAsynResult> clients中,待再有消息发送过来时,该连接将会被遍历,并且会将该连接输出内容后,结束该连接
            if (content == "-1")
            {
                clients.Add(asyncResult);
            }
            else
            {
                //将当前请求的内容输出到客户端
                asyncResult.Content = content;
                asyncResult.Send(null);            //否则将遍历所有已缓存的client,并将当前内容输出到客户端
                foreach (myAsynResult result in clients)
                {
                    result.Content = content;
                    result.Send(null);
                }            //清空所有缓存
                clients.Clear();
            }
        }
    }
    如果为-1就保持连接 如果是别的 才发送到客户端 怎么解决连接池满的问题?
      

  6.   

    服务器端的过期策略呢?我的comet是用cathe做的,过期时自动中止请求
      

  7.   


    看看IIS B的连接池的配置,设置的自大连接数和A是不是一样的。
      

  8.   


    楼主思路有问题,你的事BS 程序,不开浏览器,你推送也没用啊。
    还是用js 定时查询吧
      

  9.   

    这个不叫连接池,叫Application Pool.
      

  10.   

    我说一下我做推送的各个环节,仅供参考
    1.长连接域名与主域名不同(最好是泛域名解析),因为浏览器对于域名连接数有限制(比如Chrome现在是6个),否则用户多开几个页面浏览器就卡住了。
    2.不要使用ajax的POST,应该使用动态加载脚本,否则有的浏览器会显示页面加载中的状态。
    3.长连接采用异步模式,因为同步模式可能导致工作线程数过多。
    4.长连接超时检测(比如一分钟),防止僵死链接的累积。
      

  11.   

    另外客户端请求失败的情况,不要立即请求服务器,因为可能造成浏览器CPU过高。
      

  12.   

    Quote: 引用 13 楼 ThinkRicher 的回复:

    ...
    Quote:
    定时不行吧 就好比 你聊天 你能用定时? 都是实时的啊就是一直连接 如果不是-1了 就....
      

  13.   


    你是要实时聊天?还是只是获取一个信息? 获取信息的话,js 定时隔几秒请求一下服务器端(setInterval(wait, 5000);),够快了吧,
    还有你的-1 只是在服务端做个标志,但你的客户端还是在不断的请求服务器呢.....
      

  14.   


    你的问题估计是IIS 连接数满了
      

  15.   


    是聊天的 我也说了 请求-1的时候 就表示连接,如果不是-1 就是表示有人说话(msg)那么把msg发送到各个浏览器做处理.现在问题就是玩一会 就爆了 访问不了了 当下的别的页面 也访问不了就是这个问题 该如何优化代码 或者如何解决是从代码入手? 还是IIS?  还是配置文件? 还是.....???
      

  16.   

    -1的确请求服务器了//当传入的内容为"-1"时,表示为建立连接请求,即为了维持一个从客户端到服务器的连接而建立的连接        
    //此时将该连接保存到 List<myAsynResult> clients中,待再有消息发送过来时,该连接将会被遍历,并且会将该连接输出内容后,结束该连接
    看到这2句话了吧