设置Context.Response.StatusCode似乎不起作用

我有一个HttpHandler,代码如下:

using System; using System.Web; using Company.Cms; using Company.Web.Handlers.Console; namespace Company.Web.Handlers { ///  /// Summary description for AdminHandler ///  public class AdminHandler : IHttpHandler { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { HttpRequest request = context.Request; HttpResponse response = context.Response; string action = request.QueryString["action"]; if (!HttpContext.Current.User.CanAdminister()) { response.StatusCode = 403; response.Status = "403 Access Denied"; response.End(); return; } if (String.IsNullOrEmpty(action)) { response.StatusCode = 404; response.Status = "404 Not Found"; response.End(); return; } IHttpHandler handler = null; switch (action) { case "menu": handler = new MenuHandler(); break; case "tree": handler = new TreeHandler(); break; case "grid": handler = new GridHandler(); break; case "list": handler = new ListHandler(); break; case "drop": handler = new DropHandler(); break; case "edit": handler = new EditHandler(); break; case "new": handler = new InsertHandler(); break; } if (handler == null) { response.StatusCode = 404; response.Status = "404 Not Found"; response.End(); } else { handler.ProcessRequest(context); } } } } 

不幸的是,当我故意指定无效操作时,浏览器只显示一个空白页面。 在Firefox和IE中都显示非浏览器错误消息。

我能做错什么?

编辑 – IE显示错误消息,但Firefox没有。

Firebug显示正确的状态。 这是否意味着如果我希望浏览器显示消息,我必须自己渲染它? – deverop

绝对是这样的。 浏览器根据收到的错误代码执行的操作取决于浏览器。 但是你仍然可以提供与404一起使用的HTML。例如,请看一下Stack Overflow的404页面 。 该错误消息完全是手工制作的。

但是,通常,您希望限制从错误状态返回的数据量; 您从错误请求返回的数据越多,拒绝服务的攻击面就越大。

首先尝试这个:

 protected void Page_Load(object sender, EventArgs e) { Response.StatusCode = 404; Response.SuppressContent = true; HttpContext.Current.ApplicationInstance.CompleteRequest(); } 

:)〜

我遇到了类似的问题,仅在IIS 7.0中出现。 您还可以尝试设置

 Response.TrySkipIisCustomErrors = true;