Redirect 如何在没有ThreadAbortException的情况下将类别页面重定向到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/

(我也要回答这个问题,因为我已经找到了解决方案,但谷歌并没有真正起到帮助作用,所以希望这能为我使用的搜索词赢得一些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;
如果(使用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
也会出现同样的问题。有关详细信息,请参阅