【问题标题】:How do IIS threads handle http requests & non-http requests (background jobs)IIS 线程如何处理 http 请求和非 http 请求(后台作业)
【发布时间】:2015-09-18 15:59:24
【问题描述】:

我有一个关于 IIS 如何处理 web 应用程序请求的问题,主要是 asp.net mvc。 现在假设我有以下操作方法,可以从用户浏览器调用:-

Public ActionResult Test (string test, string test2)
{
var a = context.singleOrDefault(a=>a.ID =test);
var b = context.Table.tolist();
a.Name="NewName";
var b = context.SingleOrDefault(a2=>a2.ID = test2)
b.status = "active";
context.SaveChanges();
return View();
}

现在当用户调用action方法如下:-

https://servername/controllername/Test?test=1&test2=2

这会是 IIS 执行场景吗??:-

  1. 一个可用的 IIS 线程将处理该请求。
  2. 同一线程将填充 var a 的值,并执行所有操作,保存更改并返回视图
  3. iis 线程将被释放。

第二个问题。现在让我们说,而不是从浏览器调用此操作方法,我会及时从global.asax 文件中调用此操作方法,如下所示:-

public class MvcApplication : System.Web.HttpApplication
    {
        static void ScheduleTaskTrigger()
        {
            HttpRuntime.Cache.Add("ScheduledTaskTrigger",
                                  string.Empty,
                                  null,
                                  Cache.NoAbsoluteExpiration,
                                  TimeSpan.FromMinutes(10), 
                                  CacheItemPriority.NotRemovable,
                                  new CacheItemRemovedCallback(PerformScheduledTasks));

        }

static void PerformScheduledTasks(string key, Object value, CacheItemRemovedReason reason)
        {



            HomeController h = new HomeController();
           var c = h.Test("1","2");// 
            ScheduleTaskTrigger();
        }

那么在这种情况下 IIS 是否会参与 action 方法的执行?因为当我从 global.asax 调用 action 方法时不会有任何请求,那么这是否意味着 iis 不会受到影响?换句话说,当我从global.asax 调用操作方法时,不会占用 IIS 线程?还是因为 Web 应用程序部署在 IIS 下,所以后台作业的执行仍然会发生在 IIS 线程内?

【问题讨论】:

  • 如果您从 global.asax 调用操作方法来执行任务,您就是在滥用 MVC 架构。从您的其他问题中我可以看出,您正在使用 Hangfire。坚持使用该技术或类似技术来完成您的后台工作。不要重新发明轮子。
  • @mason 不,我在这里问不同的事情,我不是想用挂火或调度工具代替它!我只是想知道在没有http请求的情况下调用任何方法是否会通过iis完成?这是完全不同的问题..

标签: asp.net asp.net-mvc iis asp.net-mvc-5 iis-7.5


【解决方案1】:

如果您从 .NET 代码中调用控制器的操作方法,则该调用不会传到 IIS 并返回到 .NET。不涉及 HTTP。它与调用任何其他 .NET 方法的任何 .NET 方法没有什么不同。

【讨论】:

  • 所以一般来说调用方法(操作方法或任何其他方法)在后台调用时会比从用户浏览器调用时具有更好的性能和可伸缩性?这是正确的吗?我之所以这样问,是因为在我的情况下,我做了一个测试,与从用户浏览器调用该方法相比,从 global.asax 调用该方法时存在巨大的性能差异。而且我不知道为什么,但是与从 global.asax 文件中调用它相比,当我从我端调用操作方法时,IIS 似乎会变得很忙。这听起来有效吗?
  • @johnG 我不知道“巨大”。但是肯定会有 一些 开销与 HTTP 请求和响应、填充用户和会话变量等相关。在 ASP.NET 5(目前处于测试阶段)中,他们已经做了很多工作来修剪该管道,以使开销损失更小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多