当前位置: 首页 > news >正文

开发技巧:高效的使用 Response.Redirect

  我正在评估一个 ASP.NET Web 项目应用。它有一些可扩展性问题。意味着当网站访问量增加的时候。系统将会变得缓慢。当我查看应用日志。我找到了大量的 ThreadAbortException. 这个应用大量的使用了 Response.Redirect ,这个就是可扩展性问题的根源。通过endResponse = false 在Response.Redirect将会解决这个问题. 但这样做会导致应用程序出现一些奇怪的问题。因为应用程序将假设在 Response.Redirect 将在当前页面停止执行.除此之外你需要处理一些安全隐患,因为你的应用程序是假设页面事件永远不会执行重定向之后。在这篇文章中,我将讲述一个简单的方法来解决这些问题,并取得良好性能

  说明:

  比方说你有一个Web表单,需要验证一些条件并在条件不符时重定向用户跳转。

1
2
3
4
5
6
7
8
9
10
11
12
protected void Page_Load( object sender, EventArgs e)
         {
             var condition = ......;
             if (!condition)
             {
                 Response.Redirect( "SomePage.aspx" );
             }
         }
         protected void btnSave_Click( object sender, EventArgs e)
         {
             // Save Data Here
         }

  这样做很好,但这会影响可扩展性能。因为它将会终止线程池.现在,只需要用Response.Redirect("Unauthorized.aspx", false)替换Response.Redirect("Unauthorized.aspx") . 这将解决线程终止的问题,但不会停止当前页面生命周期. 也就是说,你有需要确保 btnSave_Click 事件(和所有其他页面时间)因为只要允许btnSave_Click事件执行任何人都可以很容易地发送POST请求. 为了解决这个问题我推荐使用RedirectUser扩展方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static class HttpResponseExtensions
     {
         public static void RedirectUser( this HttpResponse response, string url)
         {
             if (response.IsRequestBeingRedirected)
                 return ;
             response.Redirect(url, false );
             var context = HttpContext.Current;
             if (context != null )
             {
                 context.ApplicationInstance.CompleteRequest();
             }
         }
     }
     public partial class WebForm : System.Web.UI.Page
     {
         protected void Page_Load( object sender, EventArgs e)
         {
             var condition = .....;
             if (!condition)
             {
                 Response.RedirectUser( "Unauthorized.aspx" );
             }
         }
         protected void btnSave_Click( object sender, EventArgs e)
         {
             if (Response.IsRequestBeingRedirected)
             {
                 return ;
             }
             // Save Data Here
         }
     }

  使用 RedirectUser 第一个好处是它将首先使用对于应用程序具有良好扩展性的Response.Redirect(with endResponse= false) 方法。.第二个好处就是在你多次调用这个方法后它不会覆盖先前的Response.Redirect(如果有的话). 第三个好处是它会调用 HttpApplication.CompleteRequest用来处理  ASP.NET运行时所有通过的事件以及过滤 HTTP 管道信息(不是页面生命周期管道信息).另外你需要注意在 btnSave_Click事件中检查 Response.IsRequestBeingRedirected.我也希望你把所有的内部控制放到 Response.IsRequestBeingRedirected 检查,

1
2
3
4
5
6
7
8
< form id = "form1" runat = "server" >
         <% if(!Response.IsRequestBeingRedirected){ %>
             < asp:Button ID = "btnSave" runat = "server" Text = "Save" OnClick = "btnSave_Click" />
             <%--All the Other Controls--%>
             <%--All the Other Controls--%>
             <%--All the Other Controls--%>
         <%} %>
     </ form >

  另一件你需要注意的事情,当你使用一个复杂的控制(类似GridView, RadGrid, etc)这些拥有 选择,插入,更新和删除事件时。 当 Response.IsRequestBeingRedirected 为true时,你必须取消操作(插入,更新或删除) 这些事件,下面是一个例子

1
2
3
4
5
6
7
8
protected void GridView1_RowEditing( object sender, GridViewEditEventArgs e)
         {
             if (Response.IsRequestBeingRedirected)
             {
                 e.Cancel = true ;
                 return ;
             }
         }

总结:

  在这篇文章里,我向您展示如何使用Response.Redirect . 我同样也发现了一些风险问题。可以采用Response.Redirect优化和技术以降低风险 .也同样希望你喜欢这篇文章。 

  原文地址:using-response-redirect-effectively.aspx

  本文链接:http://www.cnblogs.com/oooweb/p/using-response-redirect-effectively.html

转载于:https://www.cnblogs.com/oooweb/p/using-response-redirect-effectively.html

相关文章:

  • 正则表达式-基础知识Review
  • Andrew Ng机器学习公开课笔记 -- 线性回归和梯度下降
  • 四则运算1
  • Windows API 第15篇 GetVolumeInformation 获取磁盘卷(驱动器)信息
  • 看完这篇文章,你还觉得Python难吗?
  • 使用AIR进行移动APP开发常见功能和问题(上)
  • 应用el-tabs模拟nav menu组件
  • “ an error occurred during ssl communication”--VisualSVN
  • mybatis 动态SQL .1
  • 从零开始编写自己的C#框架(2)——开发前准备工作
  • 下列关于异常处理的描述中,错误的是()。
  • centos搭建svn 服务器 并同步到web 目录(总结)
  • windows phone 7 中怎样定义和使用资源(Resource)
  • Scrum丰田之道
  • 一步步学习微软InfoPath2010和SP2010--第十四章节--高级选项(9)--高级函数
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【刷算法】求1+2+3+...+n
  • Android开源项目规范总结
  • android图片蒙层
  • ES6 ...操作符
  • export和import的用法总结
  • Fabric架构演变之路
  • gcc介绍及安装
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript服务器推送技术之 WebSocket
  • javascript面向对象之创建对象
  • Java多线程(4):使用线程池执行定时任务
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • python大佬养成计划----difflib模块
  • Sass 快速入门教程
  • 机器学习 vs. 深度学习
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 聊聊redis的数据结构的应用
  • 前端学习笔记之观察者模式
  • 算法之不定期更新(一)(2018-04-12)
  • 硬币翻转问题,区间操作
  • 说说我为什么看好Spring Cloud Alibaba
  • ​iOS安全加固方法及实现
  • #QT(智能家居界面-界面切换)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (安卓)跳转应用市场APP详情页的方式
  • (十一)c52学习之旅-动态数码管
  • (小白学Java)Java简介和基本配置
  • (转) RFS+AutoItLibrary测试web对话框
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net wcf memory gates checking failed
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net的socket示例
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /*在DataTable中更新、删除数据*/
  • @DataRedisTest测试redis从未如此丝滑
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [AIGC codze] Kafka 的 rebalance 机制
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作