配置 ASP.NET Core 应用程序的正确顺序是啥?

Posted

技术标签:

【中文标题】配置 ASP.NET Core 应用程序的正确顺序是啥?【英文标题】:What is the correct order in Configuring ASP.NET Core application?配置 ASP.NET Core 应用程序的正确顺序是什么? 【发布时间】:2016-12-03 21:55:28 【问题描述】:

我有一个带有多个 Web Api 控制器的 ASP.NET Core 应用程序。我不知道是否存在某种联系,但该应用程序是使用 VS2015 更新 2 创建的,现在我正在使用 VS2015 更新 3。 所以我创建了另一个 Web Api 控制器,当有对该控制器的查询时,我遇到了这个异常:

System.NotSupportedException: The given path's format is not supported.
   at System.Security.Permissions.FileIOPermission.QuickDemand(FileIOPermissionAccess access, String fullPath, Boolean checkForDuplicates, Boolean needFullPath)
   at System.IO.Path.GetFullPath(String path)
   at Microsoft.AspNet.FileProviders.PhysicalFileProvider.GetFullPath(String path)
   at Microsoft.AspNet.FileProviders.PhysicalFileProvider.GetFileInfo(String subpath)
   at Microsoft.AspNet.StaticFiles.StaticFileContext.LookupFileInfo()
   at Microsoft.AspNet.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNet.Cors.Infrastructure.CorsMiddleware.<Invoke>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.AspNet.Diagnostics.Entity.MigrationsEndPointMiddleware.<Invoke>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.AspNet.Diagnostics.Entity.DatabaseErrorPageMiddleware.<Invoke>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNet.Diagnostics.Entity.DatabaseErrorPageMiddleware.<Invoke>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.AspNet.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext()

有趣的是,StaticFileMiddleware 以某种方式参与了处理对控制器的简单请求。虽然我可以通过调用更改配置应用程序的顺序来解决问题

app.UseMvc(...

之前

app.UseStaticFiles()

我仍然想知道这是怎么发生的,以及配置应用程序的正确顺序是什么。

请记住,之前添加的所有控制器在两种配置方式下都可以正常工作,但新的控制器只能在后一种方式下工作。

新控制器不使用静态文件。

已编辑 路由: 在控制器中:

[Route("api/[controller]")]
    public class ViewsController : Controller
    
        [HttpGet("path", Name = "Views")]
        public async Task<IActionResult> Get(string path)
        
            return Json("bla");
        
    

在 Startup.cs 中:

app.UseMvc(routes =>
        
            routes.MapRoute(
                name: "angular2app",
                template: "ng/*.",
                defaults: new  controller = "Home", action = "Index" );

            routes.MapRoute(
                name: "api",
                template: "api/controller/action/id?");

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

麻烦的请求:

http://localhost:5000/api/Views/blablapath

【问题讨论】:

请从控制器发布一些导致“麻烦”的代码。 就是这样。来自控制器的代码不会造成任何麻烦,因为调用永远不会到达控制器。异常发生在之前。 我询问控制器代码的原因是,与以前的现有控制器相比,它可能有一些“特别”的地方;像 Route-Annotations,特殊命名或其他任何东西...... 你能显示为不工作的 Web API 控制器配置的路由吗?还有您请求的导致此异常的路径。 我看到您的请求以 .xml 结尾 【参考方案1】:

如果您将 Core2 预览版与发布 nuget 混合使用,您必须将静态文件 nuget 添加到您的项目中。 (Core2 已经包含了它,但是你仍然需要添加它来解决一些问题)

Microsoft.AspNetCore.StaticFiles

【讨论】:

以上是关于配置 ASP.NET Core 应用程序的正确顺序是啥?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core启动地址配置方法及优先级顺序 | .NET 6 版本

ASP.NET Core启动地址配置方法及优先级顺序 | .NET 6 版本 #yyds干货盘点#

Asp.Net Core 正确配置身份认证中间件

ASP.NET Core启动地址配置方法及优先级顺序

Asp.Net Core:IAuthorizationFilter 和 Authentication Service 的执行顺序

Asp.Net Core Identity 未正确验证令牌到期 [重复]