331 messaggi dal 06 maggio 2003
Sto diventando matto, ho provato tutte le soluzioni online ma nulla...

Avendo la necessità di fare un url rewriting per un sito mi sono basato su questa guida

http://blogs.msdn.com/b/mikeormond/archive/2008/05/14/using-asp-net-routing-independent-of-mvc.aspx

Tutto perfetto, in debaug con VS 2008 funziona correttamente. Sul mio PC ho IIS7

Nel momento di caricare il tutto sul mio VPS di Aruba non funziona più: il redirect da Default.aspx viene eseguito correttamente su miosito.com/IT/Home ma qua mi restituisce errore 404

Ho cercato soluzioni su internet e TUTTI dicono che si risolve aggiungendo alla "Wildcard application maps" la DLL isapi di asp.net ma nulla, non funziona, insiste con l'errore 404.

Come dicevo, in debug con VS 2008 il sito funziona correttamente ma nel momento un cui lo carico sul mio VPS non mi funziona più restituendo sempre errore 404.

Questo il mio codice su Global.asax


protected void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            RegisterRoute(RouteTable.Routes);
        }

        void RegisterRoute(RouteCollection routes)
        {
            routes.Add("Contacts", new System.Web.Routing.Route("{language}/Contacts", new RouteHandler("~/Contact.aspx")));
            routes.Add("Home", new System.Web.Routing.Route("{language}/Home", new RouteHandler("~/Default.aspx")));
            routes.Add("Gallery", new System.Web.Routing.Route("{language}/Gallery", new RouteHandler("~/Gallery.aspx")));
            routes.Add("Prices", new System.Web.Routing.Route("{language}/Prices", new RouteHandler("~/Prices.aspx")));
            routes.Add("Where", new System.Web.Routing.Route("{language}/Where", new RouteHandler("~/Where.aspx")));
        } 



Questo il mio codice nel RouteHandler

public class RouteHandler : IRouteHandler
    {
        public RouteHandler(string virtualPath) { this.VirtualPath = virtualPath; }
        public string VirtualPath { get; set; }

        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            string lang = requestContext.RouteData.Values["language"] as string;

            HttpContext.Current.Items["lang"] = lang;
            return (Page)BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page));
        }
    }


E questa la riga aggiunta nel web.config

<httpModules>
      <add name="RoutingModule" type="System.Web.Routing.UrlRoutingModule"/>
    </httpModules>



Cos'altro posso provare?
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
quando visiti un percorso come /IT/Home, IIS cercherà una cartella fisica sul disco ma, non trovandola, restiturà l'errore 404.

L'HttpModule può andare in esecuzione solo se IIS6 passa la richiesta al runtime di ASP.NET, e questo succede quando riceve una richiesta che termnina con una delle estensioni riconosciute come .aspx, .ashx e altre.

I tuoi URL come /IT/Home non hanno estensione e purtroppo IIS6 non ti permette di aggiungere un gestore per le risorse extensionless. Ecco dunque che si rende necessario un filtro ISAPI come Wildcard application maps, che vada in esecuzione molto presto nel ciclo di vita della richiesta e che possa riscrivere la richiesta prima che IIS6 restituisca un errore 404.

Le alternative a tua disposizione sono queste:
  • Provare un altro filtro ISAPI come Ionics Isapi Rewrite Filter. Leggi gli esempi di configurazione per capire come usarlo.
    [li]Installare il framework .NET 4 nel server e far girare il tuo sito con quella versione. L'installazione del framework 4 - così sembra - arriva con un filtro ISAPI che ti consentirà l'uso di URL senza estensione. Onestamente non mi è mai capitato di provarlo ma qui trovi i dettagli.
    http://haacked.com/archive/2010/12/22/asp-net-mvc-3-extensionless-urls-on-iis-6.aspx
    Qui un'altra guida che affronta lo stesso problema.
    http://haacked.com/archive/2008/11/26/asp.net-mvc-on-iis-6-walkthrough.aspx
  • Come ultima ipotesi, anziché usare filtri ISAPI potresti invece sostituire il documento 404.html che IIS restituisce in caso di errore, con un altro dall'estensione .aspx. L'esecuzione a quel punto passerà al runtime di ASP.NET e tu avrai un'opportunità di servire la pagina giusta perché l'URL originale ti verrà passato in querystring. Ecco una guida su come personalizzare le pagine di errore.
    http://www.iis.net/configreference/system.webserver/httperrors/error
    Se scegli per questa strada puoi provare con una configurazione simile a questa (da testare).
    <httpErrors errorMode="Custom">
      <!-- rimuovo la pagina di default di IIS6 per l'errore 404 -->
      <remove statusCode="404" subStatusCode="-1" />
      <!-- aggiungo la mia -->
      <error statusCode="404" subStatusCode="-1" path="~/pagina.aspx" responseMode="ExecuteURL" />
    </httpErrors>
    


ciao

Enjoy learning and just keep making
331 messaggi dal 06 maggio 2003
Purtroppo non mi dici nulla di nuovo. Il filtro "ISAPI come Wildcard application maps" l'ho già aggiunto, senza alcun esito.

Essendo un VPS con Windows Server 2003 e Plesk non ho la possibilità di installare il Framework 4.0

L'ultima soluzione l'ho già provata e pare in effetti essere utilizzabile, ma non mi piace per niente :(

Mi sa che cambio server, faccio prima e spendo meno...
331 messaggi dal 06 maggio 2003
Cambiato server.

Windows Server 2008 Datacenter con IIS7 e Framework 3.5.1

Continua a non funzionare ... non so più che fare.
11.886 messaggi dal 09 febbraio 2002
Contributi
buongiorno,

con IIS7 si aprono nuove opzioni e riuscirai sicuramente a far funzionare il routing.

La prima cosa da verificare è che l'application pool sia configurato sulla modalità integrata. Dunque vai nella console di IIS, seleziona "Pool di applicazioni" dal menu a sinistra. Ora nell'elenco trova l'application pool del tuo sito e controlla se la "modalità pipeline" è impostata su "integrata" o "classica". Deve essere impostata su "integrata".

Grazie ad essa, IIS potrà reindirizzare ad ASP.NET tutte le richieste web (anche quelle senza estensione). Affinché ciò sia possibile, devi anche aggiungere questa particolare configurazione al tuo web.config.
<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
  </modules>
</system.webServer>


A questo punto il routing dovrebbe funzionare.

Come ulteriore possibilità, su IIS7 puoi anche installare il modulo URL Rewrite che ti permette di definire regole di riscrittura direttamente da web.config.

ciao

Enjoy learning and just keep making
331 messaggi dal 06 maggio 2003
Mi sono creato in locale un ambiente uguale a quello del VPS di Aruba e con il Framework 3.5 non mi funziona nemmeno qua.

FW 3.5
IIS 7
App Pool Integrata

web config:

  <system.webServer>
<modules runAllManagedModulesForAllRequests="true">
      <remove name="ScriptModule"/>
      <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <remove name="UrlRoutingModule"/>
      <add name="UrlRoutingModule" preCondition="" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </modules> 
<handlers>
      <remove name="UrlRoutingHandler" />
      <remove name="WebServiceHandlerFactory-Integrated"/>
      <remove name="ScriptHandlerFactory"/>
      <remove name="ScriptHandlerFactoryAppServices"/>
      <remove name="ScriptResource"/>
      <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>
</system.webServer>




Boh ...
331 messaggi dal 06 maggio 2003
Ci capisco sempre meno: ho aggiunto al web.config questa riga

 <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 


E sul mio webserver locale ha iniziato a funzionare mentre sul VPS non funziona ancora.

Che sia perché installando il FW 4.0 in locale la DLL viene installata e utilizzata anche con application pool con target FW 2.0?
331 messaggi dal 06 maggio 2003
BrightSoul ha scritto:
buongiorno,

con IIS7 si aprono nuove opzioni e riuscirai sicuramente a far funzionare il routing.

Lo spero, altrimenti vado dal signor Aruba e lo appendo per le orecchie ...

La prima cosa da verificare è che l'application pool sia configurato sulla modalità integrata. Dunque vai nella console di IIS, seleziona "Pool di applicazioni" dal menu a sinistra. Ora nell'elenco trova l'application pool del tuo sito e controlla se la "modalità pipeline" è impostata su "integrata" o "classica". Deve essere impostata su "integrata".

Fatto, di default è impostata come "integrata"

Grazie ad essa, IIS potrà reindirizzare ad ASP.NET tutte le richieste web (anche quelle senza estensione). Affinché ciò sia possibile, devi anche aggiungere questa particolare configurazione al tuo web.config.
<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
  </modules>
</system.webServer>


A questo punto il routing dovrebbe funzionare.


Fatto anche questo, ma nulla. Se accedo dal server al sito di vede che l'handler che restituisce l'errore è lo "StaticFile handler" e non la ISAPI che dovrebbe gestire TUTTI i processi che passano... Ho provato anche ad aggiungere una wildcard ma ancora niente.


Come ulteriore possibilità, su IIS7 puoi anche installare il modulo URL Rewrite che ti permette di definire regole di riscrittura direttamente da web.config.

ciao


Questa del modulo aggiuntivo è l'unica cosa che mi manca, ma mi dà fastidio dover mettere mano a del codice funzionante solo perché non riesco a trovare la configurazione corretta per il server :-(

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.