Попытка добавить функциональность в MvcHandler - PullRequest
3 голосов
/ 15 мая 2010

Я сейчас пытаюсь добавить 301 перенаправление к моим маршрутам в MVC

для этого я попытался унаследовать от MvcHandler. Обработчик мгновенно получает правильные значения. но я никогда не смогу отладить переопределенные методы.

Может кто-нибудь показать мне рабочую попытку? канал asp.net просто кажется делает свое дело ...

public class CodeHttpHandler : MvcHandler
{
    public CodeHttpHandler(RequestContext p_requestContext)
            : base(p_requestContext)
    {
    }
    protected override void ProcessRequest(HttpContext p_httpContext)
    {
    }
    protected override void ProcessRequest(HttpContextBase p_httpContext)
    {
    }
}

Обновление:

Вот решения, которые я нашел до сих пор:

public class CodeRouteHandler : IRouteHandler
{
    public System.Web.IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new CodeHandler(requestContext);
    }
}

public class CodeRouteConstants
{
    public const string CODE = "code";
    public const string REDIRECT = "Redirect";
}

public class CodeHandler : MvcHandler
{
    public CodeHandler(RequestContext requestContext)
        : base(requestContext)
    {
    }

    private int? HandleCodedRoute(System.Web.HttpContextBase httpContext)
    {
        var context = httpContext.Request.RequestContext.RouteData;
        if (context.DataTokens.ContainsKey(CodeRouteConstants.CODE))
        {
            var statusCode = Int32.Parse(context.DataTokens[CodeRouteConstants.CODE] as string ?? "500");

            httpContext.Response.StatusCode = statusCode;

            if (context.DataTokens.ContainsKey(CodeRouteConstants.REDIRECT))
            {
                var redirectionMap = context.DataTokens[CodeRouteConstants.REDIRECT] as string ?? "404";

                foreach (var v in context.Values)
                {
                    redirectionMap = redirectionMap.Replace(string.Format("{{{0}}}", v.Key), v.Value as string);
                }

                httpContext.Response.AddHeader("Location", redirectionMap);
            }

            httpContext.Response.End();
            return statusCode;
        }
        return null;
    }

    protected override System.IAsyncResult BeginProcessRequest(System.Web.HttpContext httpContext, System.AsyncCallback callback, object state)
    {
        var statusCode = HandleCodedRoute(new HttpContextWrapper(httpContext));
        if (statusCode.HasValue)
        {
            return null;
        }
        return base.BeginProcessRequest(httpContext, callback, state);
    }

    protected override System.IAsyncResult BeginProcessRequest(System.Web.HttpContextBase httpContext, System.AsyncCallback callback, object state)
    {
        return base.BeginProcessRequest(httpContext, callback, state);
    }

    protected override void ProcessRequest(System.Web.HttpContext httpContext)
    {
        base.ProcessRequest(httpContext);
    }
    protected override void ProcessRequest(System.Web.HttpContextBase httpContext)
    {
        base.ProcessRequest(httpContext);
    }
}

1 Ответ

2 голосов
/ 16 мая 2010

Эй, я тоже столкнулся с этой проблемой. Мои точки останова в ProcessRequest () никогда не были достигнуты. У меня нет полного решения вашей проблемы, но у меня есть обходной путь, который может дать вам то, что вы хотите. Попробуйте переопределить метод BeginProcessRequest () из MvcHandler вместо ProcessRequest (). Контекст должен содержать информацию о маршруте (действии и контроллере), если это то, что вы ищете.

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