如何在没有ThreadAbortException的情况下将类别页面重定向到Umbraco中的第一个子节点

时间:2014-11-25 12:05:08

标签: redirect umbraco umbraco6

(我即将回答这个问题,因为我已经找到了解决方案,但Google并没有真正帮助,所以希望这会获得一些搜索的PageRank我正在使用的术语。)

我们有一个大型的Umbraco网站,有几个部分,但大多数地区都没有部分主页。所以,如果结构如下:

- Homepage
  - Section1
    - Page1-1
    - Page1-2
  - Section2
    - Page2-1
    - Page2-2

依此类推,然后转到~/section1/会将您重定向到~/section1/page1-1/(同样~/section2/会将您重定向到~/section2/page2-1/)。

目前,我们使用宏来检查语言环境主页中的属性,然后重定向:

var node = Model.AncestorOrSelf("SiteHome");
var useCSSV2 = node.GetProperty("useCSSV2").Value;
if (useCSSV2 == "1")
{
    Response.Redirect(Model.Children.First().Url);
}

我们在很多场合看到宏没有正确加载,但有错误,比如

  

加载MacroEngine脚本时出错(文件:PrimaryNavigationSwitcher.cshtml)

显示。看看UmbracoTraceLog,我可以看到类似的东西:

  

2014-11-25 00:11:28,226 [5]警告umbraco.macro - [Thread 39]加载MacroEngine脚本时出错(文件:PrimaryNavigationSwitcher.cshtml,类型:''。例外:系统.Threading.ThreadAbortException:线程被中止      在System.Threading.Thread.AbortInternal()
     在System.Threading.Thread.Abort(Object stateInfo)
     在System.Web.HttpResponse.AbortCurrentThread()
     在System.Web.HttpResponseWrapper.Redirect(String url)
     在d:\ webroot \ www.mysite.com \ macroScripts \ SecondLevelPageRedirection.cshtml中的ASP._Page_macroScripts_SecondLevelPageRedirection_cshtml.Execute()中:第8行      在System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
     在System.Web.WebPages.WebPage.ExecutePageHierarchy()
     在System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext,TextWriter writer,WebPageRenderingBase startPage)
     在umbraco.MacroEngines.RazorMacroEngine.ExecuteRazor(MacroModel宏,INode currentPage)
     在umbraco.MacroEngines.RazorMacroEngine.Execute(MacroModel宏,INode currentPage)
     在umbraco.macro.loadMacroScript(MacroModel宏)
     在umbraco.macro.renderMacro(Hashtable pageElements,Int32 pageId)

(SecondLevelPageRedirection.cshtml的第8行是Response.Redirect)。

该问题和ThreadAbortException本身强烈建议我,Response.Redirect是这里的问题,我应该使用其他一些方法来执行此重定向。 (即使这不是一个问题,我也宁愿避免抛出一堆异常对性能的影响。)

我们应该如何执行此重定向以获得相同的效果(因此任何前往~/section1 /的人都将被重定向到~/section1/page1-1/等等),而无需添加umbracoRedirect或者umbracoInternalRedirectId到每个节点并且没有一直抛出这些该死的ThreadAbortExceptions?

1 个答案:

答案 0 :(得分:0)

正如在少数几个地方(特别是{3}}在Stack Overflow上和MSKB上的Why Response.Redirect causes System.Threading.ThreadAbortException?中详细说明的那样,Response.Redirect(string)仅出现在ASP.Net中以便向后兼容。

PRB: ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer中的Joel Fillmore引用上面链接的Stack Overflow问题:

  

正确的模式是使用Redirect调用endResponse=false重载并调用告诉IIS管道,一旦返回控件,它应该直接前进到EndRequest阶段:< / p>

Response.Redirect(url, false);  
Context.ApplicationInstance.CompleteRequest();
     来自Thomas Marquardt的

his answer提供了其他详细信息,包括如何处理Application_Error处理程序内部重定向的特殊情况。

请注意,Context.ApplicationInstance.CompleteRequest调用后的代码将会执行,因此可能需要单独处理。

顺便提一下,问题源于Response.End,其中包含代码

InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));

然后Server.Transfer会有完全相同的问题。 This blog post

有更多信息