【发布时间】:2016-08-27 06:10:54
【问题描述】:
我尝试设置响应的状态码,但每次出现异常:发送 HTTP 标头后服务器无法设置状态。我附上了我的部分代码,我尝试了各种解决方案来解决这个问题,但没有成功。感谢您的帮助。
public class Custom404Page : Sitecore.Pipelines.HttpRequest.ExecuteRequest
{
protected override void RedirectOnItemNotFound(string url)
{
try
{
SiteContext siteContext = Context.Site;
Database database = Context.Database;
RedirectTo404Page(siteContext, database);
}
catch (Exception ex)
{
LogManager.LogError(string.Format("Custom404Page throws exception. Redirection from {0} to custom 404 page failed.", url), ex);
}
}
public void RedirectTo404Page(SiteContext siteContext, Database database)
{
try
{
if (String.IsNullOrEmpty(siteContext.StartPath))
{
return;
}
var startPage = database.GetItem(siteContext.StartPath);
var paths = startPage.Paths;
var parentPath = paths.ParentPath;
var templateId = Page404Item.TemplateId;
Item page404Item = database.SelectSingleItem("fast:/" + parentPath + "//*[@@templateid = '" + templateId + "']");
if (page404Item != null)
{
if (page404Item.Versions.Count == 0)
{
Language contentLanguage;
if (Language.TryParse(siteContext.Language, out contentLanguage))
{
Context.Language = contentLanguage;
page404Item = page404Item.Database.GetItem(page404Item.ID);
}
}
if (0 < page404Item.Versions.Count)
{
string page404Url = GetUrlFromPage404Item(page404Item);
if (!string.IsNullOrEmpty(page404Url))
{
var context = HttpContext.Current;
context.Response.Clear();
context.Server.ClearError();
context.Response.BufferOutput = true;
context.Response.TrySkipIisCustomErrors = true;
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
string html404Page = WebUtil.ExecuteWebPage(page404Url);
context.Response.Write(html404Page);
context.Response.Flush();
context.Response.SuppressContent = true;
context.ApplicationInstance.CompleteRequest();
}
}
}
}
catch (ThreadAbortException ex)
{
}
catch (WebException ex)
{
LogManager.LogError(string.Format("Page404Provider throws WebException."), ex);
}
catch (Exception ex)
{
LogManager.LogError(string.Format("Page404Provider throws exception."), ex);
}
}
private string GetUrlFromPage404Item(Item page404Item)
{
string url = string.Empty;
Page404Item data = (Page404Item)page404Item;
if (data.LinkTo404Page != null)
{
url = ItemUtility.CreateItemUrl(data.LinkTo404Page.Item, true);
}
return url;
}
}
【问题讨论】:
-
如果在使用
Response.Write()之前设置StatusCode会怎样? -
同样的问题。它没有帮助。
-
你有没有试过先做一个
context.Response.Clear();? -
我进行了更深入的测试,这也没有帮助。
-
您显然已经在此处向我们展示的代码之前添加了输出。