2016-05-18 68 views
9

Come posso eseguire la riscrittura dell'URL in ASP.NET Core RC2? La migrazione da RC1 a RC2 ha interrotto il mio routing Angular 2 quando aggiorno la pagina.Riscrittura di URL in ASP.NET Core RC2

Stavo usando una regola come questa prima nel mio web.config situato nel mio wwwroot. Con RC2 non sono nemmeno sicuro se dovrei avere un web.config nel mio wwwroot o se dovrei avere solo quello nella base del mio progetto.

Questa è la mia base di web.config

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.webServer> 
    <handlers> 
     <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> 
    </handlers> 
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" forwardWindowsAuthToken="true" stdoutLogEnabled="true" /> 
    </system.webServer> 
</configuration> 

E questo è il mio wwwroot web.config

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.webServer> 
    <rewrite> 
     <rules> 
     <!--Redirect selected traffic to index --> 
     <rule name="Index Rule" stopProcessing="true"> 
      <match url=".*" /> 
      <conditions logicalGrouping="MatchAll"> 
      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
      <add input="{REQUEST_URI}" matchType="Pattern" pattern="^/api/" negate="true" /> 
      <add input="{REQUEST_URI}" matchType="Pattern" pattern="^/account/" negate="true" /> 
      </conditions> 
      <action type="Rewrite" url="/index.html" /> 
     </rule> 
     </rules> 
    </rewrite> 
    </system.webServer> 
</configuration> 

Quando mi rinfresco un angolare 2 itinerario, ho un Status Code: 404; Not Found da ASP.NET

risposta

1

Ho trovato la soluzione di Steve Sanderson, sembra funzionare. ha scritto l'estensione a RouteBuilder. È possibile configurare in Setup.cs chiamando metodo di estensione MapSpaFallbackRoute

https://github.com/aspnet/JavaScriptServices

app.UseMvc(routes => 
      { 
       routes.MapRoute(
        name: "default", 
        template: "{controller=Home}/{action=Index}/{id?}"); 
       routes.MapSpaFallbackRoute("spa-fallback", new { controller = "Home", action = "Index" }); 
      }); 
+0

Questa è la soluzione che ho trovato in questo momento ed è geniale. Tutto quello che devi fare è installare il pacchetto ... e nel mio caso ho solo dovuto aggiungere MapSpaFallbackRoute e nel mio Index Controller per home tutto ciò che ho fatto è stato restituire File ("index.html", "text/html") e tutto funziona brillantemente Grazie! – twilliams

+0

Devi aggiungere un controller perché funzioni?Vengo dal mondo java/node e nuovo da MS-world, ma cerco di mantenere il mio progetto il più pulito possibile. Niente.Net specifico – Bulan

0

Ho avuto lo stesso identico problema. In effetti, per me, IIS Express Server non si avviava nemmeno quando la regola di riscrittura era inclusa nel file web.config. Detto questo, ho cercato un altro modo per fare la stessa cosa senza fare affidamento sulle regole di riscrittura. Ho scoperto che è possibile utilizzare la funzione MapWhen nel file startup.cs per inviare qualsiasi cosa non gestita da MVC a index.html.

Il seguente codice è stato aggiunto al metodo Configure della classe Startup.cs dopo la chiamata app.UseMvc().

 app.UseMvc(); 

     // this serves "index.html" from the wwwroot folder when 
     // a route not containing a file extension is not handled by MVC. 
     app.MapWhen(context => 
     { 
      var path = context.Request.Path.Value.ToLower(); 
      return path.Contains("."); 
     }, 
      branch => 
      { 
       branch.Use((context, next) => 
       { 
        context.Request.Path = new PathString("/index.html"); 
        return next(); 
       }); 

       branch.UseStaticFiles(); 
      }); 

Finora questo sembra il suo lavoro, ma ho bisogno di fare un po 'di test per vedere se ci sono effetti collaterali. Personalmente la regola di riscrittura sembrava una soluzione migliore, ma questo sembra farmi superare il problema.

+0

Questo handle consente l'accesso ad altri tipi di mime o chiamate API? Abbiamo json per locales e API sullo stesso server ... – droidalmatter

+0

La prima parte della mappa quando chiama con il contesto è dove decidi quali chiamate andare su MVC e cosa va al gestore di file statici. In questo modo puoi indirizzare esplicitamente solo le tue chiamate API al server e inviare tutto il resto alla tua angolare (o qualsiasi altra) app. Nel mio caso specifico abbiamo inviato solo un percorso che contiene "/ api /" in MVC. –

+0

Trovato questo codice middleware utile. Stiamo usando qualcosa di simile nel progetto 1 RC1 di Asp.net core. Sarà necessario portarlo su RC2/RTM ... https://github.com/BrainCrumbz/AWATTS/tree/master/src/WebPackAngular2TypeScript/Routing – droidalmatter

3

ho trovato una soluzione di lavoro here.

Di seguito è riportato il codice nel mio metodo Configure che ha risolto il problema per me. Ma attenzione, l'ordine di dichiarazione è importante.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 

    if (env.IsDevelopment()) { 
     app.UseDeveloperExceptionPage(); 
    } 

    app.Use(async (context, next) => { 
     await next(); 

     if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value)) { 
      context.Request.Path = "/"; 
      context.Response.StatusCode = 200; 
      await next(); 
     } 
    }); 

    app.UseDefaultFiles(); 
    app.UseStaticFiles(); 

    app.UseMvc(routes => { 
     routes.MapRoute("Default", "api/{controller}/{action}/{id?}"); 
    }); 
} 
+0

Questa è la risposta che ho usato per risolvere lo stesso problema esatto. Ha il vantaggio non trovato nella risposta accettata come soddisfacente desiderio dell'OP di utilizzare la quantità minima di codice .NET. – Gustyn

Problemi correlati