如何衡量Response.Redirect(url)和Response.Redirect(url,false)的性能?

时间:2017-05-08 21:44:39

标签: c# asp.net redirect

很多人[1] [2]Response.Redirect(url)不好,我们应该使用Response.Redirect(url,false),因为前者会抛出异常并杀死线程,因此会出现可扩展性问题。< / p>

所以我想知道两种方式之间的性能差异,数值。

我创建了一个asp.net网页,其唯一代码是Response.Redirect

I created a asp.net web page, whose only code is <code>Response.Redirect</code>

然后我编写了这个控制台应用程序来向页面发出请求。

private const int concurrentRequests = 800;

static void Main(string[] args)
{
    Console.WriteLine("Type in the URL:");
    var url = Console.ReadLine();

    Console.WriteLine($"concurrentRequests={concurrentRequests}");

    ServicePointManager.DefaultConnectionLimit = concurrentRequests;

    List<Task> tasks = new List<Task>(concurrentRequests);

    Stopwatch watch = new Stopwatch();
    watch.Start();
    for (int i = 0; i < concurrentRequests; i++)
    {
        Task t = new Task(o => GetResponse((string)o), url);
        tasks.Add(t);
        t.Start();
    }

    Task.WaitAll(tasks.ToArray());

    watch.Stop();
    Console.WriteLine($"Execution time: {watch.ElapsedMilliseconds}");
    Console.ReadKey();
}

static void GetResponse(string url)
{
    var request =(HttpWebRequest) WebRequest.Create(url);
    request.AllowAutoRedirect = false;
    var response = request.GetResponse();

    using (StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
        var content = sr.ReadToEnd();
    }
}

我还在machine.config中将asp.net线程减少到了4个。

I set <processModel maxWorkerThreads="4" maxIoThreads="4"/> in machine.config

然而,事实证明,Response.Redirect(url)需要350ms才能执行,而Response.Redirect(url,false)需要415ms。

为什么结果不符合文章中的理论?

1 个答案:

答案 0 :(得分:1)

这里还有一个更重要的问题,那就是安全问题。现在让我说一下为什么一个比另一个快。

缓慢且不安全的一个案例Response.Redirect(url,endRespose:false) 它较慢,因为使用false参数允许页面的完整周期在客户端上运行和呈现!与redirect命令一起!因此,页面通常会在客户端页面上运行并几乎呈现 - 因此速度较慢。

抛出异常的另一种情况是停止其余处理并停止进一步呈现页面 - 并且只保留重定向命令 - 以及到目前为止在页面上呈现的内容。

在我的这个问题和答案中,我分析并证明,如果你停止重定向页面,你可以看到页面的完整结果 - 如果你使用false选项设置了重定向(,false)。

Redirect to a page with endResponse to true VS CompleteRequest and security thread

要关闭,我总是使用重定向并停止页面的其余过程 - 但如果我使用另一个允许剩余处理的内容,我会想到以上所有内容 - 页面呈现并且需要额外的时间。