【问题标题】:ASP.NET Core prevent spa-fallback route for api routesASP.NET Core 防止 api 路由的 spa-fallback 路由
【发布时间】:2019-09-13 09:29:25
【问题描述】:

我的前端有一个带有 Vue.js 的 ASP.NET Core 2.2 应用程序。在我的创业公司中,我有以下路线:

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "mvc",
                template: "{controller=Home}/{action=Index}/{id?}");
            // TODO: When api route doesn't exists it goes into the spa-fallkback route. We need to prevent this.
            routes.MapSpaFallbackRoute(
                name: "spa-fallback",
                defaults: new { controller = "Home", action = "Index" });
        });

问题在于我的 API 路由。当 API URL 存在时我们没有问题,但是当 URL 不存在时,它会转到 spa-fallback 路由。

有没有办法设置路由,以便当 URL 以 /api/ 开头并且没有找到路由时,它返回 404 而不是 spa-fallback?

【问题讨论】:

    标签: c# asp.net-core routes


    【解决方案1】:

    您始终可以手动创建包罗万象的操作:

    public class HomeController : Controller
    {
        // SPA Fallback
        public IActionResult Index()
        {
            return View();
        }
    
        // Disable all other /api/* routes.
        [Route("/api/{**rest}")]
        public IActionResult Api()
        {
            return NotFound("");
        }
    }
    

    【讨论】:

      【解决方案2】:

      我害怕不是因为你为你的 SPA 定义了一个后备路由,所以 .Net 核心试图做的是寻找该路由,如果它不存在,它将转到 spa-fallback

      这里是你如何拦截API请求的行

      if (context.Request.Path.Value.StartsWith("/api"))

      public void Configure(IApplicationBuilder app, IHostingEnvironment env)
          {
              if (env.IsDevelopment())
              {
                  app.UseDeveloperExceptionPage();
              }
              else
              {
                  app.UseHsts();
              }
      
              app.UseHttpsRedirection();
      
              app.Use(async (context, next) =>
              {
                  if (context.Request.Path.Value.StartsWith("/api"))
                  {
                      await context.Response.WriteAsync("Hello");
                  }
              });
              app.UseMvc();
          }
      

      【讨论】:

        【解决方案3】:

        我们通过将项目拆分为 .UI.API 项目来解决此问题。每个都有自己的 IoC 容器、路由、...

        独立的项目还具有将它们发布到独立的应用程序池或不同服务器上的优势。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-28
          • 1970-01-01
          • 2017-04-13
          • 1970-01-01
          • 2020-10-31
          • 2021-09-04
          • 2020-05-31
          • 2018-08-25
          相关资源
          最近更新 更多