Redirect 如何在没有ThreadAbortException的情况下将类别页面重定向到Umbraco中的第一个子级
(我也要回答这个问题,因为我已经找到了解决方案,但谷歌并没有真正起到帮助作用,所以希望这能为我使用的搜索词赢得一些PageRank。) 我们有一个很大的Umbraco网站,有几个部分,但大多数地区没有部分主页。因此,如果结构看起来像:Redirect 如何在没有ThreadAbortException的情况下将类别页面重定向到Umbraco中的第一个子级,redirect,umbraco,umbraco6,Redirect,Umbraco,Umbraco6,(我也要回答这个问题,因为我已经找到了解决方案,但谷歌并没有真正起到帮助作用,所以希望这能为我使用的搜索词赢得一些PageRank。) 我们有一个很大的Umbraco网站,有几个部分,但大多数地区没有部分主页。因此,如果结构看起来像: - Homepage - Section1 - Page1-1 - Page1-2 - Section2 - Page2-1 - Page2-2 依此类推,然后转到~/section1/会将您重定向到~/section1/
- 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;
如果(使用CSSV2==“1”)
{
Response.Redirect(Model.Children.First().Url);
}
我们看到很多情况下宏无法正确加载,错误如下
加载宏引擎脚本时出错(文件:PrimaryNavigationSwitcher.cshtml)
而是显示。看着UmbracoTraceLog,我可以看到如下内容:
2014-11-25 00:11:28226[5]警告umbraco.macro-[Thread 39]加载宏引擎脚本时出错(文件:PrimaryNavigationSwitcher.cshtml,类型:“”。异常:System.Threading.ThreadAbortException:线程被中止。位于System.Threading.Thread.AbortInternal()
在System.Threading.Thread.Abort(对象状态信息)
在System.Web.HttpResponse.AbortCurrentThread()上 位于System.Web.HttpResponseWrapper.Redirect(字符串url)
在d:\webroot\www.mysite.com\macroscript\SecondLevelPageRedirection.cshtml中的ASP.\u Page\u macroscript\u SecondLevelPageRedirection\u cshtml.Execute():第8行
位于System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
位于System.Web.WebPages.WebPages.ExecutePageHierarchy()
在System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext、TextWriter writer、WebPageRenderingBase startPage)中
在umbraco.MacroEngines.RazorMacroEngine.ExecuteRazor(宏模型宏,INode当前页面)
在umbraco.MacroEngines.RazorMacroEngine.Execute(宏模型宏,INode当前页面)
在umbraco.macro.loadMacroScript(宏模型宏)中
在umbraco.macro.renderMacro(哈希表pageElements,Int32 pageId) (其中SecondLevelPageRedirection.cshtml的第8行是Response.Redirect) 这个问题和ThreadAbortException本身都强烈地向我暗示了这个响应。重定向是这里的问题,我应该使用其他一些方法来执行这个重定向。(即使这不是问题,我还是希望避免抛出一堆异常对性能的影响。) 我们应该如何执行此重定向以获得相同的效果(因此任何前往
~/section1
/的人都将被重定向到~/section1/page1-1/
,依此类推),无需向每个节点添加umbraco重定向
或umbraco内部重定向ID
,也无需一直抛出这些该死的ThreadAbortException?
正如在一些地方(特别是在这里的堆栈溢出和MSKB上)详细介绍的,Response.Redirect(string)
仅在ASP.Net中存在,以实现向后兼容性
从中引用上面链接的堆栈溢出问题:
正确的模式是使用endResponse=false
调用Redirect
重载,并发出一个调用,告诉IIS管道,一旦返回控制,它应该直接进入EndRequest
阶段:
Response.Redirect(url,false);
Context.ApplicationInstance.CompleteRequest();
来自Thomas Marquardt的文章提供了额外的细节,包括如何处理应用程序错误处理程序中重定向的特殊情况
请注意,Context.ApplicationInstance.CompleteRequest调用后的代码将执行,因此可能需要单独处理
顺便说一句,因为问题源于Response.End
,其中包括代码
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(新的HttpApplication.CancelModuleException(false));
然后,Server.Transfer
也会出现同样的问题。有关详细信息,请参阅