很多人[1] [2]说Response.Redirect(url)
不好,我们应该使用Response.Redirect(url,false)
,因为前者会抛出异常并杀死线程,因此会出现可扩展性问题。< / p>
所以我想知道两种方式之间的性能差异,数值。
我创建了一个asp.net网页,其唯一代码是Response.Redirect
。
然后我编写了这个控制台应用程序来向页面发出请求。
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个。
然而,事实证明,Response.Redirect(url)需要350ms才能执行,而Response.Redirect(url,false)需要415ms。
为什么结果不符合文章中的理论?
答案 0 :(得分:1)
这里还有一个更重要的问题,那就是安全问题。现在让我说一下为什么一个比另一个快。
缓慢且不安全的一个案例Response.Redirect(url,endRespose:false)
它较慢,因为使用false
参数允许页面的完整周期在客户端上运行和呈现!与redirect命令一起!因此,页面通常会在客户端页面上运行并几乎呈现 - 因此速度较慢。
抛出异常的另一种情况是停止其余处理并停止进一步呈现页面 - 并且只保留重定向命令 - 以及到目前为止在页面上呈现的内容。
在我的这个问题和答案中,我分析并证明,如果你停止重定向页面,你可以看到页面的完整结果 - 如果你使用false选项设置了重定向(,false)。
Redirect to a page with endResponse to true VS CompleteRequest and security thread
要关闭,我总是使用重定向并停止页面的其余过程 - 但如果我使用另一个允许剩余处理的内容,我会想到以上所有内容 - 页面呈现并且需要额外的时间。