Установка Context.Response.StatusCode, похоже, не работает - PullRequest
5 голосов
/ 22 июля 2010

У меня есть 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.

Что я могу сделать не так?

EDIT - IE отображает сообщение об ошибке, но Firefox делаетнет.

Ответы [ 3 ]

13 голосов
/ 22 июля 2010

Сначала попробуйте это:

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

:) ~

8 голосов
/ 22 июля 2010

Firebug показывает правильный статус.Означает ли это, что если я хочу, чтобы браузер отображал сообщение, я должен сделать его сам? - deverop

Абсолютно так и есть.Что делает браузер на основании полученного кода ошибки, зависит от браузера.Но вы все равно можете предоставить HTML для поддержки 404. В качестве примера ... взгляните на страницу Stack Overflow 404 .Это сообщение об ошибке полностью сделано вручную.

Как правило, однако, вы хотите ограничить объем данных, возвращаемых из состояния ошибки;чем больше данных вы возвращаете из ошибочного запроса, тем больше вероятность атаки с целью отказа в обслуживании.

3 голосов
/ 17 февраля 2014

У меня была похожая проблема, которая возникает только в IIS 7.0. То, что вы также можете попробовать, это установить

Response.TrySkipIisCustomErrors = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...