Visual Studio单页应用程序集成

Gre*_*reg 11 javascript c# asp.net single-page-application asp.net-core

技术:

  • Visual Studio 2017
  • Asp.Net核心工具1.1
  • .Net Framework 4.6.2

单页应用程序及其与Visual Studio的集成变得更加容易,Visual Studio中内置了所有新的支持.但在本周早些时候,Jeffery T. Fritz发布了一篇关于集成和使用以下软件包实现的非常好的文章:

  • Microsoft.AspNetCore.SpaServices
  • Microsoft.AspNetCore.NodeServices

在您完成并甚至分析几个模板后,您会在解决方案资源管理器中注意到一个名为的目录ClientApp.这是通过Webpack配置和路由的.

Startup.cs问题所在的内部.

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
                HotModuleReplacement = true
            });
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");

            routes.MapSpaFallbackRoute(
                name: "spa-fallback",
                defaults: new { controller = "Home", action = "Index" });
        });
    }
Run Code Online (Sandbox Code Playgroud)

在我们的请求中,我们有一些路由到我们的MVC框架.

问题是,为什么我们需要指定这条路线? 如果我们只是使用app.UseDefaultFiles()app.UseStaticFiles()我们的wwwroot指定我们的索引.我们的客户端路由器将始终返回.那么为什么我们不这样做呢:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
                HotModuleReplacement = true
            });
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseDefaultFiles();
        app.UseStaticFiles();
    }
Run Code Online (Sandbox Code Playgroud)

我知道直接在我们的wwwroot中的项目没有压缩,也可能泄漏安全性,但除了这两个缺点,为什么不使用这个路由来确保你的索引和客户端路由器不总是返回?

我特别询问强制MVC总是返回a Home/IndexUseDefaultFiles()/ 的概念UseStaticFiles().我错过了什么,为什么我们被告知迫使MVC返回它?

重要:基本上针对的问题是如何强制返回索引,以便我们的客户端框架的路由器处理更改而后端返回特定的视图状态.

War*_*War 3

这似乎是我们以前见过的所有东西,只是包装得更好。

    // allow returning of physical files on the file system of the web root and it's sub dirs
    app.UseDefaultFiles();
    app.UseStaticFiles();

    // map MVC routes to controller actions when a static file cannot be found
    app.UseMvc(routes =>
    {
       // default routing convention for mapping "most situations"
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");

        // fallback routing 
        routes.MapSpaFallbackRoute(
            name: "spa-fallback",
            defaults: new { controller = "Home", action = "Index" });
    });
Run Code Online (Sandbox Code Playgroud)

根据评论...

如果静态文件不存在,这确实是一个后备方案。但是,如果它确实在 wwwroot 中包含 index.htm,那么从技术上讲,它永远不会执行该路由,除非传递特定的标头信息