我正在使用以下实现来处理 sitecore 多站点解决方案中的 404:
在 ExecuteRequest 管道的自定义实现中,
protected override void RedirectOnItemNotFound(string url)
{
var context = HttpContext.Current;
try
{
// Request the NotFound page
var domain = context.Request.Url.GetComponents(
UriComponents.Scheme | UriComponents.Host,
UriFormat.Unescaped);
string content;
using(var webClient = new WebClient())
{
content = webClient
.DownloadString(string.Concat(domain, url));
}
// The line below is required for IIS 7.5 hosted
// sites or else IIS is gonna display default 404 page
context.Response.TrySkipIisCustomErrors = true;
context.Response.StatusCode = 404;
context.Response.Write(content);
}
catch (Exception ex)
{
Log.Error(string.Format("Failed on URL: {0}. Falling back to default redirection behaviour. Reason for error {1}", url, ex), ex);
// Fall back to default behavior on exceptions
base.RedirectOnItemNotFound(url);
}
context.Response.End();
}
现在如您所见,如果找不到 404 页面(即没有 404 页面(如站点的 web.config 中 Sitecore 的 ItemNotFound 设置中所定义),那么我正在执行 base.RedirectOnItemNotFound ,它试图有效地抛出 404 回到我的自定义 404 处理程序再次进入重定向循环。
因此,如果有人忘记向其中一个站点添加 404 页面,那么它会关闭所有其他站点并陷入僵局。
我的问题是,在其中一个站点没有 404 页面的情况下,处理这种情况的最佳方法是什么?
重新抛出异常而不是 base.Redirect..?
干杯