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

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

问题描述:

我有几个网页API控制器的ASP.NET核心应用。我不知道是否有一定的联系,但应用程序与VS2015更新2创建的,现在我用VS2015更新工作3 所以我创造了另一个网络API控制器,当有一个查询,该控制器我有此异常:配置ASP.NET Core应用程序的正确顺序是什么?

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

我还是想知道这是如何发生的解决这个问题,什么是配置应用程序的正确顺序。

请记住,所有以前添加控制器工作只是配置的两种方式很好,但新人们只能与后者合作。

新的控制器不与静态文件进行操作。

EDITED 路由: 在控制器:

[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 
+1

请从控制器发布一些导致“麻烦”的代码。 –

+0

就是这样。来自控制器的代码不会造成任何麻烦,因为调用永远不会到达控制器。之前发生异常。 –

+0

我之所以要求控制器代码是因为与以前的现有控制器相比,可能有些东西使它“特殊”。像路线注释,特殊命名或其他... –

它的工作方式是,浏览器发出请求首先到服务器,服务器将请求转发给主机监听该端口。主机环境可以是Windows上的IIS或Linux或Windows上的自主主机环境。宿主环境从第一个中间件开始执行应用程序管道。一块中间件可以做两件事,就像我看到的那样:

直接响应并且不执行其余的管道(它仍然会执行管道之前的中间件) 以某种方式操作响应,这可能是认证或一些额外的数据添加到响应

enter image description here

静态文件,如HTML,CSS,图像和JavaScript,是一个ASP.NET核心应用可以直接服务于客户资产。为了提供静态文件,您必须配置中间件以将静态文件添加到管道。 app.UseStaticFiles()(默认wwwroot)中可投放使得Web根目录中的文件。

UseMvc()扩展方法将路由中间件添加到请求管道并将MVC配置为默认处理程序。

所以你看,中序使用MVC中间件您应提供静态文件资源,这是什么您的异常已经说。

+1

感谢您丰富多彩的答案!但是对于我来说,为什么有些控制器没有这个顺序的麻烦,还有一些人会这么做,他们都没有提供静态文件。 –