Question

J'ai un site où une partie est webforms (Umbraco CMS) et une partie est MVC Ceci est le HttpHandler pour faire face à la fonctionnalité 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);
        }
}

Tous les détails de la façon dont cela est mis en œuvre ici Cette méthode fonctionne bien dans un site MVC 1.0. Cependant, lorsque je mets à jour ce site à MVC 2.0 suivant les étapes mise à niveau de Microsoft documentation ; tout est compilé, sauf lors de l'exécution, je reçois cette exception:

  

Erreur de serveur dans l'application '/'.
   La ressource ne peut être trouvé.   Description: HTTP 404. La ressource   que vous recherchez (ou un de ses   dépendances) auraient été enlevés,   avait changé son nom, ou est   temporairement indisponible. S'il vous plaît   Vérifiez l'URL suivante et assurez-vous   qu'il est correctement orthographié.

     

URL demandée: /mvc.ashx

     

Informations sur la version Microsoft .NET   Cadre Version: 2.0.50727.4927;   ASP.NET Version: 2.0.50727.4927

Cette ressource et il les dépendances se trouvent bien dans MVC 1.0, mais pas dans MVC 2.0, est-il une dépendance supplémentaire je dois ajouter? Y at-il quelque chose que je suis absent? Y at-il un changement dans la façon MVC 2.0 fonctionne?

Était-ce utile?

La solution

Un mot d'avertissement - les types MvcHandler et MvcHttpHandler ne sont pas destinés à être sous-classé par le code utilisateur. Ces gestionnaires changeront avec les futures versions du cadre, de sorte que tous les types qui les sous-classe sont soumis à la rupture. Dans cet esprit ..

Dans MVC 2, le type MvcHttpHandler est un IHttpAsyncHandler , pas seulement un IHttpHandler . Cela change la sémantique de la façon dont ASP.NET exécute le gestionnaire. Si vous le sous-classe MvcHttpHandler, vous devez remplacer le BeginProcessRequest et EndProcessRequest méthodes, en plus de la méthode ProcessRequest .

Un mécanisme plus sûr serait d'envelopper le MvcHttpHandler au lieu de sous-classer. Cela est, faire votre propre IHttpHandler dont la méthode ProcessRequest () seulement des délégués à nouveau MvcHttpHandler.ProcessRequest () . De cette façon, les modifications du fonctionnement de MvcHttpHandler ne doit pas entraîner votre gestionnaire d'emballage à briser.

Autres conseils

est ce que je l'ai fait et cela fonctionne ...

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);
    }

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top