2

我使用名为 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 而不是 aTransferRequest那么它不是正确的 404,因为 url 已经改变了......

这样做的正确方法是什么?

提前感谢艾尔

4

5 回答 5

1

不是您问题的直接答案,但也可以看看这个开源 404 处理程序:https ://www.coderesort.com/p/epicode/wiki/404Handler

它也可以在 episervers nuget feed 上使用

于 2012-02-06T10:55:44.023 回答
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>
于 2012-02-06T16:08:28.630 回答
0

您应该在用于 404 页面的模板的代码隐藏中设置状态代码。

如果这是一个纯内容页面,则创建一个新模板或向页面添加一个状态代码属性,并在后面的代码中添加逻辑以发送适当的标头(如果该标头不为空或为空)。

于 2012-02-06T12:05:26.253 回答
0

感谢您的回复。

我实际上是通过执行以下操作来完成这项工作的:

在 EndRequest 事件处理程序中,我将请求转移到正确的 EPiServer 页面,并在调用中包含了一个查询字符串参数,即

app.Context.Server.TransferRequest(pageUrl + "&internal=true");

然后在 PostRequestHandlerExecute 事件中检查查询字符串参数,如果它存在,那只能是因为它是 404,所以我返回正确的状态:

HttpContext.Current.Response.StatusCode = 404; HttpContext.Current.Response.StatusDescription = "页面未找到";

奇迹般有效。

谢谢希格西

于 2012-02-06T12:28:55.320 回答
0

尝试在您转移到的页面上设置状态代码 - 在您的错误页面模板中。我不确定是否需要单独的模块 - 您可以简单地处理 Global.asax.cs 中的 HttpApplication 的错误事件。

于 2012-02-06T12:08:30.580 回答