我开发了一个web服务,由于内部程序的计算特别耗费cpu,所以希望能把响应用户的请求数限制在一定的数量内。比如同时有100个用户请求了我的服务,我希望只是同时相应5个客户的请求,处理完这5个后再去响应剩下的请求。应该如何设置,是不是设置machine.config中的processmodel节点?具体该如何设置呢?

解决方案 »

  1.   

    使用HttpModule,在用户请求的时候判断请求的是不是要限制的页,如果是,查看一下当前正在处理的请求是多少。如果数量达到最大数,就不处理。
      

  2.   

    可是我是希望延迟处理,而不是不处理。HttpModul能完成这样的功能吗?期待高手啊。要交工了,急死我这IT民工了!
      

  3.   

    可以另起一个线程做计算工作,线程监视一个队列,挨个处理队列中的请求。HttpModule负责分析用户请求,如果是请求计算的,则直接把请求放入队列中。
      

  4.   

    首先感谢一下iyond。可是由于我是新手,也是第一次作ASP。所以觉得你说的还是有点抽象。另起一个线程去计算我理解。可是如何让一个线程去监视一个队列,并挨个处理其中的请求呢。如果有例子的话,那真的是太感激了。我先前以为应该和processmodel的设置有关系的,难道没有吗?
      

  5.   

    sorry,没有看清你的是Web服务,不过估计也可以按照下面的方法做。
    如果是普通的HTTP请求,可以这样:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Threading;
    using System.Collections.Generic;/// <summary>
    /// Calculate 的摘要说明
    /// </summary>
    public class Calculate 
    {
        bool c = true;
        Thread _t = null;
        static List<Job> Jobs = null;    public Calculate() 
        {
            Jobs = new List<Job>();
        }    public void Start()
        {
            _t = new Thread(new ThreadStart(Calc));
            _t.Start();
        }    public void Stop()
        {
            c = false;
        }    public void Calc()
        {
            while (c)
            {
                Job job = null;            lock (Jobs)
                {
                    if (Jobs.Count > 0)
                    {
                        job = Jobs[0];
                        Jobs.RemoveAt(0);
                    }
                }            if (job != null)
                {
                    job.ShowResult(job.A + job.B);
                }            //Thread.Sleep(10000);//体现计算复杂度:)
            }
        }    public static void AppendJob(Job job)
        {
            lock (Jobs)
            {
                Jobs.Add(job);
            }
        }
    }public class Job
    {
        private int a = 0;
        public int A { get { return a; } }
        private int b = 0;
        public int B { get { return b; } }
        private HttpContext context;
        private bool finished = false;
        public bool Finished { get { return finished; } }    public Job(int a, int b, HttpContext context)
        {
            this.a = a;
            this.b = b;
            this.context = context;        
        }    public void ShowResult(int result)
        {
            context.Response.Write(result.ToString());
            context.Response.Flush();
            this.finished = true;
        }
    }public class WorkModule : System.Web.IHttpModule
    {
        #region IHttpModule 成员    public void Dispose()
        {
        }    public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }    void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication)sender;
            int a = Convert.ToInt32(app.Context.Request.QueryString["a"]);
            int b = Convert.ToInt32(app.Context.Request.QueryString["b"]);        Job j = new Job(a, b, app.Context);
            Calculate.AppendJob(j);        while (!j.Finished)
            {
                Thread.Sleep(100);
            }
        }    #endregion
    }在Web.config中添加下面的节:
          <httpModules>
            <add name="Calculate" type="WorkModule"/>
          </httpModules>
    在Global.asax中:
        void Application_Start(object sender, EventArgs e) 
        {
            // 在应用程序启动时运行的代码
            Calculate c = new Calculate();
            c.Start();
            Application.Add("Calculate", c);
        }
        
        void Application_End(object sender, EventArgs e) 
        {
            //  在应用程序关闭时运行的代码
            Calculate c = (Calculate)Application["Calculate"];
            c.Stop();
        }
    Calculate类起了一个线程,负责计算工作。这个线程在程序起动时开始,在程序结束时停止。
    Job类是对要计算的对象的一个描述,同时也存储了用户的HttpContext
    WorkModule类继承IHttpModule接口,负责得到用户请求,创建计算对象,并放到计算线程的队列中。
      

  6.   

    iyond,十分感谢你的代码,我会好好研读的。谢谢!