ResponseのStatusCodeを設定しようとしましたが、例外が発生するたびにサーバーはHTTPヘッダーが送信された後でステータスを設定できません。コードの一部を添付しましたが、これを修正するためにさまざまな解決策を試しましたが、成功しませんでした。ご協力ありがとうございました。HttpResponse StatusCode - 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'を設定するとどうなりますか? – NineBerry
同じ問題です。それは助けにならない。 – Krpo
最初に 'context.Response.Clear();'をやってみましたか? –