ประวัติ ASP.NET 5 HTML5

ฉันกำลังอัปเกรดโครงการเป็น ASPNET5 แอปพลิเคชันของฉันคือ AngularJS Web App ที่ใช้การกำหนดเส้นทาง URL ของ HTML5 ( HTML5 History API )

ในแอปก่อนหน้าของฉัน ฉันใช้โมดูล URL Rewrite 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 หรือไม่


person amcdnl    schedule 02.07.2015    source แหล่งที่มา
comment
ใช่ คุณสามารถบรรลุเป้าหมายนั้นได้ด้วย middleware   -  person agua from mars    schedule 02.07.2015
comment
สนใจที่จะแสดงให้เห็นว่าคุณจะทำสิ่งนี้ให้สำเร็จได้อย่างไร?   -  person amcdnl    schedule 02.07.2015
comment
มี middleware ตัวอย่างมากมายใน GitHub สิ่งหนึ่งที่ฉันเขียน: github.com/aguacongas/chatle/tree/dev/ src/ChatLe.HttpUtility   -  person agua from mars    schedule 02.07.2015


คำตอบ (3)


คุณมาถูกทางแล้ว แต่แทนที่จะส่งการเปลี่ยนเส้นทางกลับ เราเพียงต้องการเขียนเส้นทางในคำขอใหม่ รหัสต่อไปนี้ใช้งานได้ตั้งแต่ 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 ให้เขียนใหม่และส่งกลับ ( เนื่องจากสิ่งอื่นนอกเหนือจาก /api ควรได้รับการจัดการแล้ว) อย่างไรก็ตาม ฉันไม่สามารถทำงานนั้นได้

person Bill    schedule 19.01.2016
comment
เหตุใดจึงถือเส้นทางเชิงมุมบนฝั่งเซิร์ฟเวอร์นั่นมันโง่ การเรียก API ทั้งหมดไปยังเซิร์ฟเวอร์เริ่มต้นด้วย 'api' คุณสามารถใช้ .StartsWith('api',request.Path) เพื่อกำหนดว่าจะตั้งค่า / หรือไม่ใช่ไหม - person Elisabeth; 08.11.2017
comment
คุณสามารถกลับตรรกะเพื่อเก็บเส้นทางส่วนหลังได้อย่างแน่นอน (ในกรณีของคุณ แค่ api) แทนที่จะเป็นเส้นทางส่วนหน้า ในกรณีของฉัน มันสมเหตุสมผลมากกว่าที่จะทำอย่างแรก เพราะเรามีเส้นทางส่วนหน้าค่อนข้างน้อยและเส้นทางส่วนหลังหลายเส้นทางนอกเหนือจาก api ไม่ว่าจะด้วยวิธีใดมันก็เป็นสิ่งเดียวกัน คุณเขียนเส้นทางที่ต้องไปที่ Angular ใหม่ โปรดทราบว่าหากแอป ASP.NET ของคุณมีหน้าที่ให้บริการไฟล์ (html, css ฯลฯ) คุณจะต้องคำนึงถึงเส้นทางเหล่านั้นนอกเหนือจาก api - person Bill; 09.11.2017

ฉันกำลังใช้:

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

ซึ่งจะทำให้เส้นทางทั้งหมดเข้าสู่หน้า Home Index เมื่อฉันต้องการเส้นทางที่จะอยู่นอกเส้นทางนี้ ฉันจะเพิ่มไว้ข้างหน้าเส้นทางนี้เนื่องจากเส้นทางนี้จะกลายเป็นเส้นทางที่จับได้ทั้งหมด

person Rangoric    schedule 03.03.2016

ทำไมไม่ใช้คุณสมบัติการกำหนดเส้นทางใน 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?}");
        });  
person Michael Palermo    schedule 09.07.2015
comment
ใช้ไม่ได้กับประวัติ HTML5 คุณต้องกำหนดเส้นทางเนื้อหา/api ผ่านทุกสิ่งเท่านั้นที่ควรส่งคืนไฟล์ดัชนี - person amcdnl; 13.07.2015