Domanda

Creazione di ihttpmoduli personalizzati, mi sono reso conto che le richieste per i file statici (ad esempio: .css e file .js) stanno colpendo i moduli gestiti. Probabilmente le immagini hanno lo stesso problema. IIS non dovrebbe bypass asp.net per i file che esistono nel filesystem?

Per esempio:

public class MyModule:IHttpModule
{
    public void Dispose(){ }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += (o, e) => Debug.Print("Request: " + HttpContext.Current.Request.RawUrl);
    }
}

E lo dichiaro in questo modo:

<modules runAllManagedModulesForAllRequests="true">
  <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX"/>
</modules>

Ma, anche usando il presupposto posso vedere come i file statici passano attraverso il modulo:

Request: /MVCX/
Request: /MVCX/Content/Site.css
Request: /MVCX/Scripts/jquery-1.4.4.min.js

Ho provato a ignorare le regole per i file statici, ma non fa la differenza:

routes.IgnoreRoute("{Content}/{*pathInfo}");
routes.IgnoreRoute("{Scripts}/{*pathInfo}");

È questo il solito? O mi manca qualcosa qui? Per quanto ne so, se la richiesta di file statica dovrebbe essere data risposta da IIS. Se il mio modulo gestito viene colpito, significa che un thread di threadpool CLR sta gestendo quella richiesta, giusto?

Saluti.

AGGIORNARE:

Ho disabilitato "RunallManagedModulesforallRequests":

<modules runAllManagedModulesForAllRequests="false">
      <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX" />
</modules>

E tutto sembra funzionare bene, ma ho trovato questo articolo: http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html Ciò consiglia di rimuovere e leggere il modulo "UrlRoutingModule-4.0" con un preliminare vuoto.

I My My Machine, l'aggiunta di quel modulo è nel Web Root.Config e ha già un preliminare vuoto:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type machine.config | find "UrlRouting"


C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type web.config | find "UrlRouting"
            <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>

Quindi ora sono un po 'confuso, qual è lo stato di questo parametro? Dovrei usarlo o non dovrei? Perché è "vero" per impostazione predefinita?

Saluti.

È stato utile?

Soluzione

I My My Machine, l'aggiunta di quel modulo è nel Web Root.Config e ha già un preliminare vuoto

Perfetto. Ciò significa che questo modulo verrà sempre eseguito per MVC in quanto utilizza URL senza estensione.

Quindi ora sono un po 'confuso, qual è lo stato di questo parametro? Dovrei usarlo o non dovrei? Perché è "vero" per impostazione predefinita?

Perché il supporto URL senza estensione è nuovo in IIS7 SP1 e IIS7.5 SP1. È disponibile per IIS7 come patch che devi richiedere e installare. Lo troverai qui con risposte complete alle tue domande:http://support.microsoft.com/kb/980368

Perché questo parametro diventa vero per impostazione predefinita? Perché VS2010 è stato spedito prima di IIS7 SP1. Forse è falso in nuovi progetti MVC in VS2010SP1?

Altri suggerimenti

Rispondere alla tua prima domanda sul fatto che IIS dovrebbe bypassare ASP.NET per contenuti statici.

Se configurato in modalità integrata, IIS 7.5, consentirà ai moduli gestiti di registrarsi per eventi relativi a richieste che non sono tradizionalmente gestite da ASP.NET, come i file statici.

Ciò non accade nella modalità classica IIS 7.5, che è simile a IIS 6 e non consente a un modulo gestito di ascoltare eventi in richieste che non sono gestite da ASP.NET.

Quindi, fondamentalmente se hai runAllManagedModulesForAllRequests="true" Con la modalità integrata, il tuo modulo gestito verrà avvisato degli eventi per ogni richiesta. Inoltre, dal documentazione su runAllManagedModulesForAllRequests:

Vero se tutti i moduli gestiti possono elaborare tutte le richieste, anche se la richiesta non era per il contenuto gestito; altrimenti, falso.

Il valore predefinito è falso.

La documentazione non spiega come questo attributo interagisce con il preCondition opzione. Da quello che hai vissuto sembra sovrascrivere il preCondition configurazione, quindi se fossi tu lo lascerei false E solo lavora con il preCondition Opzioni anche se significa alterare altri moduli precondizioni in una stringa vuota per alternazione il cambiamento di runAllManagedModulesForAllRequests a false.


Aggiornare: Ho trovato qualche documentazione sulle implicazioni dell'uso di runAllManagedModulesForAllRequests e come già affermato, se vero, è una sovraccarico per il preCondition con un managedHandler opzione.

È inoltre possibile utilizzare un collegamento per abilitare tutti i moduli gestiti (ASP.NET) di eseguire tutte le richieste nell'applicazione, indipendentemente dal presupposto "gestito". Per consentire a tutti i moduli gestiti di eseguire per tutte le richieste senza configurare ogni voce del modulo per rimuovere la preliminare "gestite", utilizzare la proprietà RunallManagedModulesforallRequests nella sezione:

Quando si utilizza questa proprietà, il preliminare "ManagedHandler" non ha alcun effetto e tutti i moduli gestiti eseguono tutte le richieste.

Puoi scrivere il seguente codice per questo.

routes.IgnoreRoute("{*allcss}", new { allaspx = @".*\.css(/.*)?" });
routes.IgnoreRoute("{*alljs}", new { allaspx = @".*\.js(/.*)?" });

Si prega di trovare maggiori informazioni sul link seguente

http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

Suppongo che, se desideri davvero ignorare, non dovresti usare parentesi curve:

routes.IgnoreRoute("Content/{*pathInfo}");
routes.IgnoreRoute("Scripts/{*pathInfo}");

Prova questo per ignorare l'elenco di tutti i file statici

routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(js|css|gif|jpg|png)(/.*)?" });
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top