2015-07-02 21 views
8

Tôi đang nâng cấp dự án của mình lên ASPNET5. Ứng dụng của tôi là Ứng dụng web AngularJS sử dụng Định tuyến Url HTML5 (HTML5 History API).Lịch sử HTML5 5 HTML5

Trong ứng dụng trước đây của tôi tôi đã sử dụng URL Rewrite IIS Mô-đun với các mã như:

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

Tôi nhận ra tôi có thể cổng này nhưng tôi muốn thu nhỏ cửa sổ phụ thuộc của tôi. Từ đọc của tôi, tôi nghĩ rằng tôi sẽ có thể sử dụng ASP.NET 5 Middleware để thực hiện việc này.

Tôi nghĩ mã sẽ trông giống như thế này nhưng tôi nghĩ tôi khá xa.

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

Về cơ bản, tôi muốn định tuyến mọi thứ có chứa /api hoặc /signalr. Bất kỳ đề xuất về cách tốt nhất để thực hiện điều này trong ASPNET5?

+0

Có, bạn có thể đạt được điều đó với một 'middleware' –

+0

Chăm sóc để cho biết cách bạn có thể thực hiện việc này? – amcdnl

+0

có rất nhiều mẫu 'middleware' trên' GitHub'. Tôi đã viết: https://github.com/aguacongas/chatle/tree/dev/src/ChatLe.HttpUtility –

Trả lời

-1

Tại sao không sử dụng tính năng định tuyến trong MVC? Trong phương pháp Configure trong Startup.cs, bạn có thể sửa đổi như sau:

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

Không hoạt động cho lịch sử HTML5, bạn chỉ cần định tuyến tài sản/api qua mọi thứ khác nên trả về tệp chỉ mục . – amcdnl

4

Bạn đã đi đúng hướng, nhưng thay vì gửi lại chuyển hướng, chúng tôi chỉ muốn viết lại đường dẫn trên yêu cầu. Các mã sau đây là làm việc như của 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(); 

Một vấn đề ở đây là bạn phải đặc biệt mã tuyến đường góc vào phần giữa (hoặc đặt chúng trong tệp cấu hình, v.v.).

Ban đầu, tôi đã cố tạo đường ống trong đó sau UseDefaultFiles() và UseStaticFiles() đã được gọi, nó sẽ kiểm tra đường dẫn và nếu đường dẫn không phải là/api, hãy viết lại và gửi lại (kể từ bất cứ điều gì khác hơn/api nên đã được xử lý rồi). Tuy nhiên, tôi không bao giờ có thể làm được điều đó.

+0

lý do tại sao giữ các tuyến đường góc ở phía máy chủ, đó là ngu ngốc. Tất cả các cuộc gọi API đến máy chủ bắt đầu bằng 'api', bạn có thể dễ dàng sử dụng .StartsWith ('api', request.Path) để xác định thời gian để đặt "/" hay không, phải không? – Elisabeth

+0

Bạn chắc chắn có thể đảo ngược logic để giữ các tuyến đường kết thúc (trong trường hợp của bạn, chỉ là "api") chứ không phải là các tuyến đầu cuối. Trong trường hợp của tôi nó có ý nghĩa hơn để làm việc trước đây, bởi vì chúng tôi có tương đối ít tuyến đường kết thúc trước và một số tuyến đường kết thúc trở lại ngoài "api". Dù bằng cách nào nó cũng giống như vậy. Bạn viết lại các tuyến đường cần đến Angular. Hãy ghi nhớ rằng nếu ứng dụng ASP.NET của bạn cũng chịu trách nhiệm phục vụ các tệp (html, css, v.v.), bạn sẽ cần phải tính đến các đường dẫn đó ngoài "api". – Bill

0

Tôi đang sử dụng:

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

Điều này sẽ khiến tất cả các tuyến đường để nhấn Trang chủ Index. Khi tôi cần các tuyến đường để rơi ra ngoài này, tôi thêm chúng trước tuyến đường này vì nó trở thành một tuyến đường bắt tất cả.