代码之家  ›  专栏  ›  技术社区  ›  Alfero Chingono

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

  •  5
  • Alfero Chingono  · 技术社区  · 14 年前

    我有一个HttpHandler,代码如下:

    using System;
    using System.Web;
    using Company.Cms;
    using Company.Web.Handlers.Console;
    
    
    namespace Company.Web.Handlers
    {
        /// <summary>
        /// Summary description for AdminHandler
        /// </summary>
        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中都会显示非浏览器错误消息。

    我会做错什么?

    编辑

    3 回复  |  直到 14 年前
        1
  •  8
  •   Community CDub    8 年前

    Firebug显示正确的状态。做 这意味着如果我想要浏览器 要显示消息,我必须渲染 是我自己吗?

    当然了。浏览器根据收到的错误代码执行的操作取决于浏览器。但是您仍然可以提供HTML来支持404。举个例子。。。看一看 Stack Overflow's 404 page . 这个错误消息完全是手工制作的。

        2
  •  14
  •   VladL Tejas    11 年前

    先试试这个:

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

    :)~

        3
  •  3
  •   VladL Tejas    11 年前

    Response.TrySkipIisCustomErrors = true;
    
        4
  •  0
  •   Colin    4 年前

    301重定向使用 Response.RedirectPermanent() .

    对于302重定向,请使用 Response.Redirect()

            if (isPermanentRedirect)
            {
                // 301 Redirect
                args.HttpContext.Response.RedirectPermanent(targetUrl);
            }
            else
            {
                // 302 Redirect
                args.HttpContext.Response.Redirect(targetUrl);
            }