如何限制用户的请求数

wtxidian 2006-07-11 10:44:58
我开发了一个web服务,由于内部程序的计算特别耗费cpu,所以希望能把响应用户的请求数限制在一定的数量内。比如同时有100个用户请求了我的服务,我希望只是同时相应5个客户的请求,处理完这5个后再去响应剩下的请求。应该如何设置,是不是设置machine.config中的processmodel节点?具体该如何设置呢?
...全文
267 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wtxidian 2006-07-13
  • 打赏
  • 举报
回复
iyond,十分感谢你的代码,我会好好研读的。谢谢!
wtxidian 2006-07-12
  • 打赏
  • 举报
回复
可是我是希望延迟处理,而不是不处理。HttpModul能完成这样的功能吗?期待高手啊。要交工了,急死我这IT民工了!
mextb1860 2006-07-12
  • 打赏
  • 举报
回复
帮你定
wtxidian 2006-07-12
  • 打赏
  • 举报
回复
首先感谢一下iyond。可是由于我是新手,也是第一次作ASP。所以觉得你说的还是有点抽象。另起一个线程去计算我理解。可是如何让一个线程去监视一个队列,并挨个处理其中的请求呢。如果有例子的话,那真的是太感激了。我先前以为应该和processmodel的设置有关系的,难道没有吗?
iyond 2006-07-12
  • 打赏
  • 举报
回复
可以另起一个线程做计算工作,线程监视一个队列,挨个处理队列中的请求。HttpModule负责分析用户请求,如果是请求计算的,则直接把请求放入队列中。
iyond 2006-07-12
  • 打赏
  • 举报
回复
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接口,负责得到用户请求,创建计算对象,并放到计算线程的队列中。
阿良chjlcn 2006-07-12
  • 打赏
  • 举报
回复
关注,帮你顶。
wuhuabucai 2006-07-12
  • 打赏
  • 举报
回复
mark+up
www_123du_com 2006-07-12
  • 打赏
  • 举报
回复
HttpModule,用队列控制
cm8983 2006-07-12
  • 打赏
  • 举报
回复
up
iyond 2006-07-11
  • 打赏
  • 举报
回复
使用HttpModule,在用户请求的时候判断请求的是不是要限制的页,如果是,查看一下当前正在处理的请求是多少。如果数量达到最大数,就不处理。
haidazi 2006-07-11
  • 打赏
  • 举报
回复
关注!
xiong1000 2006-07-11
  • 打赏
  • 举报
回复
mark

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧