2015-07-02 36 views
8

Uaktualniam mój projekt do ASPNET5. Moja aplikacja to aplikacja internetowa AngularJS, która korzysta z routingu adresu URL HTML5 (HTML5 History API).ASP.NET 5 Historia HTML5

W moim poprzednim aplikacji użyłem URL Rewrite IIS moduł z kodem jak:

<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> 

Zdaję sobie sprawę, mogłem tego portu, ale chcę, aby zminimalizować moje okna zależności. Z mojego czytania wynika, że ​​powinienem móc użyć oprogramowania pośredniego ASP.NET 5, aby to osiągnąć.

Myślę, że kod wyglądałby tak, ale myślę, że jestem dość daleko.

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); 
    } 
}); 

Zasadniczo, jestem chcąc niczego trasie, która zawiera /api lub /signalr. Wszelkie sugestie na najlepszy sposób osiągnięcia tego w ASPNET5?

+0

Tak, możesz to osiągnąć dzięki "middleware" –

+0

Dbanie, aby pokazać, jak możesz to osiągnąć? – amcdnl

+0

Na 'GitHub' jest dużo próbek' middleware'. Jeden napisałem: https://github.com/aguacongas/chatle/tree/dev/src/ChatLe.HttpUtility –

Odpowiedz

-1

Dlaczego nie używać funkcji routingu w MVC? W metodzie skonfigurować w Startup.cs, można zmodyfikować następujące:

 // 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

Nie działa dla historii HTML5, musisz tylko kierować zasoby/api przez wszystko inne powinno zwrócić plik indeksu . – amcdnl

4

Byłaś na dobrej drodze, ale zamiast odesłanie przekierowanie, chcemy po prostu przepisać ścieżkę w sprawie wniosku. Poniższy kod działa od wersji 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(); 

Jednym z problemów jest to, że trzeba specjalnie zakodować swoje kątowe trasy do warstwy pośredniej (lub umieścić je w pliku konfiguracyjnym, etc).

Początkowo starałem się stworzyć rurociągu gdzie po UseDefaultFiles() i UseStaticFiles() został powołany, by to sprawdzić ścieżkę, a jeśli ścieżka nie była/api, przerobić go i wysłać go z powrotem (od wszystko inne niż/api powinno być już obsługiwane). Jednak nigdy nie mogłem tego zrobić.

+0

dlaczego trzymać trasy kątowe po stronie serwera, to głupie. Wszystkie wywołania API do serwera zaczynają się od "api", możesz łatwo użyć .StartsWith ("api", request.Path), aby określić, czy ustawić "/", czy nie, prawda? – Elisabeth

+0

Z pewnością można odwrócić logikę, aby utrzymać trasy z tyłu (w twoim przypadku, tylko "api"), a nie trasy z przodu. W moim przypadku bardziej sensownym jest robienie tego pierwszego, ponieważ mamy stosunkowo mało frontowych tras i kilka końcowych tras poza "api". Tak czy inaczej, sprowadza się to do tego samego. Przepisujesz trasy, które muszą przejść do Angular. Pamiętaj, że jeśli twoja aplikacja ASP.NET jest również odpowiedzialna za serwowanie plików (html, css, itp.), Będziesz musiał uwzględnić te ścieżki oprócz "api". – Bill

0

Używam:

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

To spowoduje, że wszystkie trasy trafić stronie głównej indeksu. Kiedy potrzebuję tras, aby wyjść poza to, dodaję je przed tą trasą, ponieważ staje się to haczykiem na całej trasie.