2015-07-02 19 views
8

Ich aktualisiere mein Projekt auf ASPNET5. Meine Anwendung ist eine AngularJS-Webanwendung, die HTML5-URL-Routing verwendet (HTML5 History API).ASP.NET 5 HTML5-Verlauf

In meinem vorherigen app habe ich die URL Rewrite IIS-Modul mit Code wie:

<system.webServer> 
    <rewrite> 
    <rules> 
     <rule name="MainRule" stopProcessing="true"> 
     <match url=".*" /> 
     <conditions logicalGrouping="MatchAll"> 
      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
      <add input="{REQUEST_URI}" matchType="Pattern" pattern="api/(.*)" negate="true" /> 
      <add input="{REQUEST_URI}" matchType="Pattern" pattern="signalr/(.*)" negate="true" /> 
     </conditions> 
     <action type="Rewrite" url="Default.cshtml" /> 
     </rule> 
    </rules> 
    </rewrite> 
<system.webServer> 

Ich weiß, ich könnte diesen Port aber ich mag meine Fenster Abhängigkeiten minimieren. Von meiner Lektüre sollte ich in der Lage sein, ASP.NET 5 Middleware zu verwenden, um dies zu erreichen.

Ich denke, der Code würde ungefähr so ​​aussehen, aber ich denke, dass ich ziemlich weit weg bin.

app.UseFileServer(new FileServerOptions 
{ 
    EnableDefaultFiles = true, 
    EnableDirectoryBrowsing = true 
}); 

app.Use(async (context, next) => 
{ 
    if (context.Request.Path.HasValue && context.Request.Path.Value.Contains("api")) 
    { 
     await next(); 
    } 
    else 
    { 
     var redirect = "http://" + context.Request.Host.Value;// + context.Request.Path.Value; 
     context.Response.Redirect(redirect); 
    } 
}); 

Im Wesentlichen, ich bin zu routen etwas wollen, die /api oder /signalr enthält. Irgendwelche Vorschläge für den besten Weg, dies in ASPNET5 zu erreichen?

+0

Ja, Sie können das mit einer 'Middleware' erreichen –

+0

Möchten Sie zeigen, wie Sie dies erreichen könnten? – amcdnl

+0

Es gibt eine Menge 'Middleware'-Samples auf' GitHub'. Eine, die ich schrieb: https://github.com/aguacongas/chatle/tree/dev/src/ChatLe.HttpUtility –

Antwort

-1

Warum nicht Routing-Funktion in MVC verwenden? Im Configure-Methode in Startup.cs, könnten Sie ändern die folgenden:

 // inside Configure method in Startup.cs 
     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller}/{action}/{id?}", 
       defaults: new { controller = "Home", action = "Index" }); 

      // Uncomment the following line to add a route for porting Web API 2 controllers. 
      // routes.MapWebApiRoute("DefaultApi", "api/{controller}/{id?}"); 
     }); 
+0

Funktioniert nicht für HTML5-Geschichte, müssen Sie nur Vermögenswerte/api durch alles andere sollte die Indexdatei zurückgeben . – amcdnl

4

Sie auf dem richtigen Weg waren, sondern eher als das Senden eine Umleitung zurück, wir wollen nur den Weg auf der Antrag neu zu schreiben. Der folgende Code funktioniert ab ASP.NET5 RC1.

app.UseIISPlatformHandler(); 

// This stuff should be routed to angular 
var angularRoutes = new[] {"/new", "/detail"}; 

app.Use(async (context, next) => 
{ 
    // If the request matches one of those paths, change it. 
    // This needs to happen before UseDefaultFiles. 
    if (context.Request.Path.HasValue && 
     null != 
     angularRoutes.FirstOrDefault(
     (ar) => context.Request.Path.Value.StartsWith(ar, StringComparison.OrdinalIgnoreCase))) 
    { 
     context.Request.Path = new PathString("/"); 
    } 

    await next(); 
}); 

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

Ein Problem dabei ist, dass Sie gezielt, um Ihre Winkel Routen in die Middleware-Code (oder sie in einer Konfigurationsdatei setzen, etc).

Anfangs habe ich versucht, eine Pipeline zu schaffen, wo nach UseDefaultFiles() und UseStaticFiles() war genannt worden, hätte es den Pfad zu überprüfen, und wenn der Pfad nicht/api war umzuschreiben und zurückschicken (seit alles andere als/api sollte bereits behandelt worden sein). Allerdings konnte ich das nie zur Arbeit bringen.

+0

Warum halten die eckigen Routen auf der Serverseite, das ist dumm. Alle API-Aufrufe an den Server beginnen mit "api". Sie können einfach .StartsWith ('api', request.Path) verwenden, um zu bestimmen, ob "/" gesetzt werden soll oder nicht, richtig? – Elisabeth

+0

Sie könnten natürlich die Logik invertieren, um die Back-End-Routen (in Ihrem Fall nur "api") statt der Front-End-Routen zu halten. In meinem Fall ist es sinnvoller, Ersteres zu machen, da wir neben "api" relativ wenige Front-End-Routen und mehrere Back-End-Routen haben. So oder so ist es gleich. Sie schreiben die Routen neu, die nach Angular gehen müssen. Beachten Sie, dass, wenn Ihre ASP.NET-App auch für die Bereitstellung der Dateien zuständig ist (HTML, CSS, usw.), Sie diese Pfade zusätzlich zu "api" berücksichtigen müssen. – Bill

0

Ich verwende:

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name:"Everything", 
     template:"{*UrlInfo}", 
     defaults:new {controller = "Home", action = "Index"}); 
} 

Dies wird alle Routen führen die Home-Index Seite zu schlagen. Wenn ich Routen brauche, die außerhalb dieser Route liegen, füge ich sie vor dieser Route hinzu, da dies zu einer "catch all route" wird.