2015-07-02 3 views
8

Я обновляю свой проект до ASPNET5. Мое приложение - веб-приложение AngularJS, которое использует маршрутизацию URL-адресов HTML5 (HTML5 History API).ASP.NET 5 История HTML5

В моем предыдущем приложении, которое я использовал URL Rewrite Module IIS с помощью следующего кода:

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

Я понимаю, что я мог перенести это, но я хочу, чтобы свести к минимуму моих окон зависимостей. Из моего чтения я считаю, что должен использовать ASP.NET 5 Middleware для этого.

Я думаю, что код будет выглядеть примерно так, но я думаю, что я довольно далеко.

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

По сути, я хотел что-нибудь маршрут, который содержит /api или /signalr. Любые предложения по наилучшему способу выполнения этого в ASPNET5?

+0

Да, вы можете достичь этого с помощью «промежуточного программного обеспечения» –

+0

Уход, чтобы показать, как вы можете это сделать? – amcdnl

+0

На 'GitHub' существует множество образцов« промежуточного слоя ». Один из них я написал: https://github.com/aguacongas/chatle/tree/dev/src/ChatLe.HttpUtility –

ответ

-1

Почему бы не использовать функцию маршрутизации в MVC? В методе Configure в Startup.cs, можно изменить следующим образом:

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

Не работает для истории HTML5, вам нужно только маршрутизировать ресурсы/api через все остальное, чтобы вернуть индексный файл , – amcdnl

4

Вы были на правильном пути, но вместо отправки обратно редирект, мы просто хотим, чтобы переписать путь на запрос. Следующий код работает с 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(); 

Одна проблема здесь в том, что вы должны специально кодировать свои угловые маршруты в ПО промежуточного слоя (или поместить их в конфигурационный файл, и т.д.).

Сначала я попытался создать трубопровод, где был вызван после UseDefaultFiles() и UseStaticFiles(), он будет проверять путь, и если путь не был/апи, переписать его и отправить его обратно (с что-нибудь другое, кроме/api, должно быть обработано уже). Тем не менее, я никогда не смог заставить это работать.

+0

Зачем держать угловые маршруты на стороне сервера, это глупо. Все вызовы API на сервер начинаются с «api», вы можете легко использовать .StartsWith («api», request.Path), чтобы определить, устанавливать ли «/» или нет, не так ли? – Elisabeth

+0

Вы могли бы, конечно, инвертировать логику, чтобы удерживать маршруты конца (в вашем случае, просто «api»), а не маршруты переднего конца. В моем случае имеет смысл делать первое, потому что у нас относительно мало маршрутов конца и несколько путей назад, кроме «api». В любом случае это то же самое. Вы переписываете маршруты, которые нужно переместиться в Angular. Имейте в виду, что если ваше приложение ASP.NET также отвечает за обслуживание файлов (html, css и т. Д.), Вам нужно будет учитывать эти пути в дополнение к «api». – Bill

0

Я использую:

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

Это заставит все маршруты попасть на страницу Home Index. Когда мне нужны маршруты, выходящие за пределы этого, я добавляю их перед этим маршрутом, так как это становится уловкой всего маршрута.