zoukankan      html  css  js  c++  java
  • ASP.NET页面跳转Response.Redirect抛出异常

    在ASP.NET按钮响应中跳转到其他的页面,会抛出异常’Thread was being aborted’,如下代码

    try
    {
        string redirectUrl = "~/Default.aspx";
        Response.Redirect(redirectUrl);
    }
    catch (System.Exception ex)
    {
    }

    在微软的站点上找到有对应的问题:

    ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer

    按照微软的解决方案,只要调用Response.Redirect的重载函数Response.Redirect(String url, bool endResponse),其中endResponse传入false就可以了

    Response.Redirect(redirectUrl,false);
    我看了一下ASP.NET的源代码,其中会抛出一个异常,下面是代码:
         /// <devdoc> 
         ///    <para>Redirects a client to a new URL.</para> 
         /// </devdoc>
            public void Redirect(String url, bool endResponse) { 
                if (url == null)
                    throw new ArgumentNullException("url");
    
                if (url.IndexOf('\n') >= 0) 
                    throw new ArgumentException(SR.GetString(SR.Cannot_redirect_to_newline));
     
                if (_headersWritten) 
                    throw new HttpException(SR.GetString(SR.Cannot_redirect_after_headers_sent));
     
                Page page = _context.Handler as Page;
                if ((page != null) && page.IsCallback) {
                    throw new ApplicationException(SR.GetString(SR.Redirect_not_allowed_in_callback));
                } 
    
                url = ApplyRedirectQueryStringIfRequired(url); 
     
                url = ApplyAppPathModifier(url);
     
                url = ConvertToFullyQualifiedRedirectUrlIfRequired(url);
    
                url = UrlEncodeRedirect(url);
     
                Clear();
     
                // If it's a Page and SmartNavigation is on, return a short script 
                // to perform the redirect instead of returning a 302 (bugs ASURT 82331/86782)
    	#pragma warning disable 0618    // To avoid SmartNavigation deprecation warning 
                if (page != null && page.IsPostBack && page.SmartNavigation && (Request["__smartNavPostBack"] == 	       	"true")) {
    	#pragma warning restore 0618
                    Write("<BODY><ASP_SMARTNAV_RDIR url=\"");
                    Write(HttpUtility.HtmlEncode(url)); 
                    Write("\"></ASP_SMARTNAV_RDIR>");
     
                    Write("</BODY>"); 
                }
                else { 
                    this.StatusCode = 302;
                    RedirectLocation = url;
                    Write("<html><head><title>Object moved</title></head><body>\r\n");
                    Write("<h2>Object moved to <a href=\"" + HttpUtility.HtmlAttributeEncode(url) + 		"\">here</a>.</h2>\r\n"); 
                    Write("</body></html>\r\n");
                } 
     
                _isRequestBeingRedirected = true;
     
                if (endResponse)
                    End();
            }
    
            /*
             * Cancelles handler processing of the current request 
             * throws special [non-]exception uncatchable by the user code
             * to tell application to stop module execution. 
             */ 
    
            /// <devdoc> 
            ///    <para>Sends all currently buffered output to the client then closes the
            ///       socket connection.</para>
            /// </devdoc>
            public void End() { 
    
                if (_context.IsInCancellablePeriod) { 
                    InternalSecurityPermissions.ControlThread.Assert(); 
                    Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
                } 
                else {
                    // when cannot abort execution, flush and supress further output
                    if (!_flushing) { // ignore Reponse.End while flushing (in OnPreSendHeaders)
                        Flush(); 
                        _ended = true;
     
                        if (_context.ApplicationInstance != null) { 
                            _context.ApplicationInstance.CompleteRequest();
                        } 
                    }
                }
            }

    上面的红色代码Thread.CurrentThread.Abort里面就会抛出异常,只要执行还在容许Cancel的时间都会抛异常。

    当然什么时候会不容许呢(_context.IsInCancellablePeriod为false),我倒是没看了。
  • 相关阅读:
    js把秒数转换为HH:MM:SS及时分秒格式
    java将流量KB转换为GB、MB、KB格式
    java将秒数转换为时分秒格式
    springboot前端向后端请求返回html语句
    java判断手机号三大运营商归属的工具类
    Java读取txt文件、excel文件的方法
    Linux安装JDK、Mysql和Tomcat
    原理篇—文件包含漏洞
    原理篇—上传漏洞
    原理篇—CSRF 跨站脚本请求伪造
  • 原文地址:https://www.cnblogs.com/Quincy/p/1884743.html
Copyright © 2011-2022 走看看