Domanda

Ho un sito in cui è parte webforms (Umbraco CMS) e parte è MVC Questo è il HttpHandler a che fare con la funzionalità 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);
        }
}

I dettagli completi di come questo viene implementato qui Questo metodo funziona bene in un MVC 1.0 sito. Tuttavia quando aggiorno questo sito per MVC 2.0 seguendo la procedura descritta in di aggiornamento di Microsoft documentazione ; tutto viene compilato, tranne che in fase di esecuzione ottengo questa eccezione:

  

Errore del server in '/' applicazione.
   La risorsa non può essere trovato.
  Descrizione: HTTP 404. La risorsa   siete alla ricerca di (o uno dei suoi   dipendenze) potrebbe sono stati rimossi,   aveva il suo nome cambiato, o è   temporaneamente non disponibile. per favore   rivedere il seguente URL e assicurarsi   che sia stato digitato correttamente.

     

URL richiesto: /mvc.ashx

     

Informazioni sulla versione: Microsoft .NET   Versione quadro: 2.0.50727.4927;   ASP.NET Version: 2.0.50727.4927

Questa risorsa ed è dipendenze si trovano bene in MVC 1.0 ma non in MVC 2.0, c'è una dipendenza in più che avevo bisogno di aggiungere? C'è qualcosa che mi manca? C'è un cambiamento nel modo di MVC 2.0 funziona?

È stato utile?

Soluzione

Una parola di cautela - i tipi MvcHandler e MvcHttpHandler non sono destinate ad essere sottoclasse dal codice utente. Questi gestori cambiano con le versioni future del quadro, in modo che qualsiasi tipo che li sottoclasse sono soggette a rottura. Con questo in mente ..

In MVC 2, il tipo MvcHttpHandler è un IHttpAsyncHandler , non solo un IHttpHandler . Questo cambia la semantica di come ASP.NET esegue il gestore. Se si sottoclasse il MvcHttpHandler, è necessario eseguire l'override del BeginProcessRequest e EndProcessRequest metodi in aggiunta al ProcessRequest metodo.

Un meccanismo più sicuro sarebbe quello di avvolgere la MvcHttpHandler invece di subclassing esso. Cioè, rendere il proprio IHttpHandler cui ProcessRequest () metodo di delega a nuova MvcHttpHandler.ProcessRequest () . In questo modo, le modifiche al funzionamento di MvcHttpHandler non dovrebbe causare il gestore di avvolgimento a rompere.

Altri suggerimenti

Questo è quello che ho fatto e funziona ...

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top