url rewriting - mvc - Reescritura de URL en ASP.NET Core RC2
redirect mvc core (3)
¿Cómo puedo lograr la reescritura de URL en ASP.NET Core RC2? La migración de RC1 a RC2 rompió mi enrutamiento angular 2 cuando actualicé la página.
Estaba usando una regla como esta antes en mi web.config ubicado en mi wwwroot. Con RC2 no estoy seguro de si se supone que tengo un web.config en mi wwwroot, o si se supone que tengo uno en la base de mi proyecto.
Esta es mi base 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>
Y este es mi 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>
Cuando actualizo una ruta angular 2, obtengo un Status Code: 404; Not Found
Status Code: 404; Not Found
desde ASP.NET
Yo tuve exactamente el mismo problema. De hecho, para mí, el servidor IIS Express ni siquiera se inició cuando se incluyó la regla de reescritura en el archivo web.config. Dado esto, busqué otra forma de hacer lo mismo sin depender de reglas de reescritura. Descubrí que puedes usar la función MapWhen en tu archivo startup.cs para enviar todo lo que no maneja MVC a index.html.
El código siguiente se ha agregado al método Configure de la clase Startup.cs después de la llamada 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();
});
Hasta ahora, parece que funciona, pero necesito hacer más pruebas para ver si hay algún efecto secundario. Personalmente, la regla de reescritura parecía una mejor solución, pero parece que esto me permite superar el problema.
Encontré la solución de Steve Sanderson, parece funcionar. él escribió la extensión a RouteBuilder. Puede configurarlo en Setup.cs llamando al método de extensión 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" });
});
Encontré una solución de trabajo aquí .
A continuación se muestra el código en mi método de configuración que me solucionó el problema. Pero ten cuidado, el orden de la declaración importa.
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?}");
});
}