Utilizzando un personalizzato MvcHttpHandler v2.0 Rompere cambiamento 1,0-2,0?
-
20-09-2019 - |
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?
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);
}
}