Comment acheminer TOUT autre que des Web API /index.html
J'ai travaillé sur un AngularJS projet, à l'intérieur de ASP.NET MVC à l'aide de l'API Web. Il fonctionne très bien sauf lorsque vous essayez d'accéder directement à un angulaires acheminé URL ou actualiser la page. Plutôt que de monkeying avec la configuration du serveur, j'ai pensé que ce serait quelque chose que je pouvais faire avec MVC du moteur de routage.
Actuel WebAPIConfig:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { id = @"^[0-9]+$" }
);
config.Routes.MapHttpRoute(
name: "ApiWithActionAndName",
routeTemplate: "api/{controller}/{action}/{name}",
defaults: null,
constraints: new { name = @"^[a-z]+$" }
);
config.Routes.MapHttpRoute(
name: "ApiWithAction",
routeTemplate: "api/{controller}/{action}",
defaults: new { action = "Get" }
);
}
}
Actuel RouteConfig:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute(""); //Allow index.html to load
routes.IgnoreRoute("partials/*");
routes.IgnoreRoute("assets/*");
}
}
Mondiale Actuelle.asax.cs:
public class WebApiApplication : HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
var formatters = GlobalConfiguration.Configuration.Formatters;
formatters.Remove(formatters.XmlFormatter);
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
PreserveReferencesHandling = PreserveReferencesHandling.None,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
};
}
}
OBJECTIF:
/api/* continue d'aller en WebAPI, /partiels/, et /assets/ ira tous au système de fichiers, absolument rien d'autre est routée vers /index.html qui est mon Angulaire single page app.
--EDIT--
Me semble que j'ai eu à travailler. Ajoutée à la BAS DE RouteConfig.cs:
routes.MapPageRoute("Default", "{*anything}", "~/index.html");
Et ce changement à la racine web.config:
<system.web>
...
<compilation debug="true" targetFramework="4.5.1">
<buildProviders>
...
<add extension=".html" type="System.Web.Compilation.PageBuildProvider" /> <!-- Allows for routing everything to ~/index.html -->
...
</buildProviders>
</compilation>
...
</system.web>
Toutefois, il sent comme un hack. Une meilleure façon de faire cela?
- Comme une note pour ceux qui tentent (et pour lesquels les réponses ci-dessous ne sont pas l'idéal), le hack répertoriés dans cette question fonctionne, MAIS pas si le chemin d'accès de l'utilisateur saisit aussi un dossier. Ainsi, par exemple, si vous voie tout à
~/index.html
, puis le chemin d'accès/whatever/
ne voie là SI vous n'avez pas de chemin d'accès au dossier au sein de votre application appelée/whatever/
. - Toutes les idées sur la façon de résoudre cette mise en garde?
Vous devez vous connecter pour publier un commentaire.
Utilisez un caractère générique segment:
Suggèrent natifs de l'approche
dans mon cas, aucune de ces approches n'a fonctionné. j'ai été coincé dans 2 message d'erreur de l'enfer. soit ce type de page n'est pas servi ou une sorte de 404.
de réécriture d'url travaillé:
avis je les ai trouvé sur [a-zA-Z] parce que je ne veux pas réécrire tout de la .js .carte etc urls.
cette travaillé dans VS hors de la boîte, mais dans IIS, vous devez peut-être installer un url rewrite module https://www.iis.net/downloads/microsoft/url-rewrite
.*(api)
J'ai eu la même approche que le haut de quelques réponses, mais l'inconvénient est que si quelqu'un fait un appel API de manière incorrecte, ils finissent par obtenir que la page d'index en arrière au lieu de quelque chose de plus utile.
J'ai donc mis à jour mine, telle qu'elle sera de retour à ma page d'index pour toute demande de ne pas mettre l' /api:
Bien, j'ai juste enlevé le
RouteConfig.RegisterRoutes(RouteTable.Routes);
appel dansGlobal.asax.cs
et maintenant, quelle que soit l'url-je entrer, si la ressource existe, il sera servi. Même l'Aide de l'API Pages encore du travail.