高效的使用Response.Redirect解决一些不必要的问题(转载)

时间:2023-01-24 19:35:56

这篇文章主要介绍了如何高效的使用 Response.Redirect解决一些不必要的问题,需要的朋友可以参考下

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

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

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扩展方法。

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 检查,

<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时,你必须取消操作(插入,更新或删除) 这些事件,下面是一个例子

protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
if (Response.IsRequestBeingRedirected)
{
e.Cancel = true;
return;
}
}

总结:

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

高效的使用Response.Redirect解决一些不必要的问题(转载)的更多相关文章

  1. 高效的使用 Response&period;Redirect

    介绍: 我正在评估一个 ASP.NET Web 项目应用.它有一些可扩展性问题.意味着当网站访问量增加的时候.系统将会变得缓慢.当我查看应用日志.我找到了大量的 ThreadAbortExceptio ...

  2. 开发技巧:高效的使用 Response&period;Redirect

    我正在评估一个 ASP.NET Web 项目应用.它有一些可扩展性问题.意味着当网站访问量增加的时候.系统将会变得缓慢.当我查看应用日志.我找到了大量的 ThreadAbortException. 这 ...

  3. aspx在页面跳转(Response&period;Redirect)时丢失session问题及解决办法

    [问题描述] 假设a.aspx.cs页面保存有Session["empid"]="3",当a.aspx.cs通过Response.Redirect(" ...

  4. 如何解决Response&period;Redirect方法传递汉字丢失或乱码问题?

    为了确保传递的汉字被正确地接收,可以在传值之前使用Server对象的UrlEncode方法对所传递的汉字进行URL编码.代码如下: String name = Server.UrlEncode(&qu ...

  5. Response&period;Redirect&lpar;&quot&semi;x&period;aspx&rpar;&semi;跳转后session为null的解决方法

    通常我们做登陆的时候都是登录成功后为管理员保存一些信息,一般都会写类似下面的代码 if(登录成功) { Session["xx"] = "user"; Resp ...

  6. 调用Response&period;Redirect 捕获异常 解决办法&lpar;摘抄&rpar;

    如果使用 Response.End.Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException 异常.您可以使用 try-catch ...

  7. Response&period;Redirect与Server&period;Transfer区别-转

    执行过程: 1.浏览器ASP文件请求->服务器执行->遇到response.redirect语句->服务器发送response.redirect后面的地址给客户机端的浏览器-> ...

  8. Server&period;Transfer 和 Response&period;Redirect 用法区别

    在ASP.NET中,在后台传值方式目前大多都是用 Response.Redirect("页面地址") 来重定向页面的,但是现在还有一种方式也可以达到重定向页面的作用,而且在某些时刻 ...

  9. try catch中用了 Response&period;Redirect 引发的线程异常终止

    记录一下,提醒自己. 今天写代码的时候,在try 中写了一句  Response.Redirect 在 catch 把页面重定向到了另外一个地方 本来是想打算,如果没出现异常,就定到页面A,如果异常了 ...

随机推荐

  1. Lesson 24 It could be worse

    Text I entered the hotel manager's office and sat down. I had just lost £50 and I felt very upset. ' ...

  2. equal与&equals;&equals;

    首先做的是比较引用,引用的如果是同一个对象,直接返回true.做完return就结束了.如果引用不是同一个地址,就往下走,判断是否是String的一个实例.同样,不是的话直接返回.是的话,拿字符串的长 ...

  3. AngularJS分页实现

    基本思路 一开始页码为1,Service向服务器端获取对应信息:点击上/下一页/跳转,通过对应的页码向服务器端获取对应的信息. 由于后台暂时没弄好,我实现的过程中直接读取准备好的JSON文件,通过页码 ...

  4. STL中的单向队列queue

    转载自:http://blog.csdn.net/morewindows/article/details/6950917 stl中的queue指单向队列,使用时,包含头文件<queue>. ...

  5. 3、href和src的区别

    href:将现在的页面连接到新的页面 src:将需要引用的东西添加到现在的页面 <a href="mailto:youremailaddress@host.com">C ...

  6. 【Linux】文件存储结构

    大部分的Linux文件系统(如ext2.ext3)规定,一个文件由目录项.inode和数据块组成: 目录项:包括文件名和inode节点号.  Inode:又称文件索引节点,包含文件的基础信息以及数据块 ...

  7. Android 6&period;0 默认关闭定位和GPS,开启后默认选省电

    默认关闭定位和GPS 修改位置 frameworks/base/packages/SettingsProvider/res/values/defaults.xml <string name=&q ...

  8. CMakeList&period;txt(1):cmake error

    cmake_symlink_library: System Error: Operation not supported 1/创建链接不成功,要确认当前帐户下是否有权限在编译的目录中有创建链接的权限 ...

  9. 使用Phalcon框架开发一个简易的博客系统

    使用Phalcon PHP框架开发一个简易的博客系统(类似于CMS) 最近在做Phalcon(Phalcon在英文中指的是鸟类中飞得最快的那一个物种,由于是高性能框架,借用了这个词)相关的项目,由于刚 ...

  10. 20165232第4次实验《Android程序设计》实验报告

    20165232第4次实验<Android程序设计>实验报告 一.实验报告封面 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:何彦达 学号:20165232 指导教师: ...