引见:
我正在评价一个 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优化和技术以下降风险 .也异样盼望你爱好这篇文章。
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务