我正在使用名为EPiServer的CMS产品。我们需要创建自己的显示404的方法,这是使用.NET的标准customErrors无法实现的。我们编写了一个模块,用于检查HttpStatusCode
。我们在EndRequest方法中执行此操作。
如果状态为404,我们查询EPiServer以获取相应的404页面,然后将请求转移到该页面。但是这不会返回404,即使我执行以下操作,也不会返回正确的状态:
HttpContext.Current.Response.StatusCode = 404;
HttpContext.Current.Response.StatusDescription = "Page not Found";
HttpContext.Current.Server.TransferRequest(newPage);
同样,如果我执行了response.redirect而不是TransferRequest
,那么它就不是一个合适的404,因为网址已经改变了......
这样做的正确方法是什么?
提前致谢 Al
答案 0 :(得分:1)
不能直接回答您的问题,但也可以看看这个开源404处理程序:https://www.coderesort.com/p/epicode/wiki/404Handler
它也适用于episervers nuget feed
答案 1 :(得分:1)
您使用的是哪个IIS版本?对于IIS7或7.5,您可能需要以下内容:
<httpErrors errorMode="Custom">
<remove statusCode="404" />
<error statusCode="404" path="/somenotfoundpage.aspx" responseMode="ExecuteURL" />
<remove statusCode="500" />
<error statusCode="500" path="/someerrorpage.aspx" responseMode="ExecuteURL" />
</httpErrors>
答案 2 :(得分:0)
您应该在您用于404页面的模板的代码隐藏中设置状态代码。
如果这是纯内容页面,请创建新模板或向页面添加状态代码属性,并在后面的代码中添加逻辑,以便在不为null或为空时发送相应的标头
答案 3 :(得分:0)
尝试在错误页面模板中设置转移到的页面上的状态代码。我不确定是否需要单独的模块 - 您可以在Global.asax.cs中简单地处理HttpApplication的Error事件。
答案 4 :(得分:0)
感谢您的回复。
我实际上通过以下方式实现了这个目标:
在EndRequest事件处理程序中,我将请求转移到正确的EPiServer页面,并在调用中包含一个查询字符串参数,即
app.Context.Server.TransferRequest(pageUrl +“&amp; internal = true”);
然后在PostRequestHandlerExecute事件中我检查查询字符串参数,如果它存在,那只能是因为它是404所以我返回正确的状态:
HttpContext.Current.Response.StatusCode = 404; HttpContext.Current.Response.StatusDescription =“找不到页面”;
像魅力一样。
由于 higgsy