Используете пользовательский MvcHttpHandler v2.0. Прерывистое изменение с 1.0 на 2.0? - PullRequest
0 голосов
/ 19 марта 2010

У меня есть сайт, где часть веб-форм (Umbraco CMS), а часть MVC Это HttpHandler для работы с функциональностью MVC:

public class Mvc : MvcHttpHandler
{
    protected override void ProcessRequest(HttpContext httpContext)
    {
        httpContext.Trace.Write("Mvc.ashx", "Begin ProcessRequest");
        string originalPath = httpContext.Request.Path;
        string newPath = httpContext.Request.QueryString["mvcRoute"];
        if (string.IsNullOrEmpty(newPath))
            newPath = "/";

        httpContext.Trace.Write("Mvc.ashx", "newPath = "+newPath );

        HttpContext.Current.RewritePath(newPath, false);
        base.ProcessRequest(HttpContext.Current);
        HttpContext.Current.RewritePath(originalPath, false);
        }
}

Полная информация о том, как это реализовано здесь Этот метод хорошо работает на веб-сайте MVC 1.0. Однако, когда я обновляю этот сайт до MVC 2.0, следуя инструкциям Документация по обновлению Microsoft ; все компилируется, кроме как во время выполнения я получаю это исключение:

Ошибка сервера в приложении '/'.
Ресурс не найден.
Описание: HTTP 404. Ресурс вы ищете (или один из его зависимости) можно было бы удалить, изменилось ли его имя, или Временно недоступен. пожалуйста просмотрите следующий URL и убедитесь, что что оно написано правильно.

Запрошенный URL: /mvc.ashx

Информация о версии: Microsoft .NET Версия Framework: 2.0.50727.4927; ASP.NET версия: 2.0.50727.4927

Этот ресурс и его зависимости хорошо видны в MVC 1.0, но не в MVC 2.0. Нужно ли добавить дополнительную зависимость? Я что-то упускаю? Есть ли изменения в работе MVC 2.0?

Ответы [ 2 ]

3 голосов
/ 03 июня 2010

Это то, что я сделал, и это работает ...

public class mvc : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{

    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext httpContext)
    {
        string originalPath = httpContext.Request.Path;
        HttpContext.Current.RewritePath(httpContext.Request.ApplicationPath, false);
        IHttpHandler httpHandler = new MvcHttpHandler();
        httpHandler.ProcessRequest(HttpContext.Current);
        HttpContext.Current.RewritePath(originalPath, false);
    }

}
3 голосов
/ 19 марта 2010

Предостережение: типы MvcHandler и MvcHttpHandler не предназначены для использования в подклассах пользовательского кода. Эти обработчики будут меняться в будущих версиях фреймворка, поэтому любые типы, которые подклассируют их, могут быть взломаны. Имея это в виду ..

В MVC 2 тип MvcHttpHandler является IHttpAsyncHandler , а не просто IHttpHandler . Это меняет семантику того, как ASP.NET выполняет обработчик. Если вы создаете подкласс MvcHttpHandler, вам необходимо переопределить методы BeginProcessRequest и EndProcessRequest в дополнение к методу ProcessRequest .

Более безопасный механизм заключался бы в обертывании MvcHttpHandler вместо его подкласса. То есть создайте свой собственный IHttpHandler, метод ProcessRequest () которого просто делегирует новый MvcHttpHandler.ProcessRequest () . Таким образом, изменения в работе MvcHttpHandler не должны приводить к поломке вашего обработчика переноса.

...