(我即将回答这个问题,因为我已经找到了解决方案,但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?
答案 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>来自Thomas Marquardt的Response.Redirect(url, false); Context.ApplicationInstance.CompleteRequest();
his answer提供了其他详细信息,包括如何处理
Application_Error
处理程序内部重定向的特殊情况。
请注意,Context.ApplicationInstance.CompleteRequest
调用后的代码将会执行,因此可能需要单独处理。
顺便提一下,问题源于Response.End
,其中包含代码
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
然后Server.Transfer
会有完全相同的问题。 This blog post