配置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
它的工作方式是,浏览器发出请求首先到服务器,服务器将请求转发给主机监听该端口。主机环境可以是Windows上的IIS或Linux或Windows上的自主主机环境。宿主环境从第一个中间件开始执行应用程序管道。一块中间件可以做两件事,就像我看到的那样:
直接响应并且不执行其余的管道(它仍然会执行管道之前的中间件) 以某种方式操作响应,这可能是认证或一些额外的数据添加到响应
静态文件,如HTML,CSS,图像和JavaScript,是一个ASP.NET核心应用可以直接服务于客户资产。为了提供静态文件,您必须配置中间件以将静态文件添加到管道。 app.UseStaticFiles()(默认wwwroot)中可投放使得Web根目录中的文件。
UseMvc()扩展方法将路由中间件添加到请求管道并将MVC配置为默认处理程序。
所以你看,中序使用MVC中间件您应提供静态文件资源,这是什么您的异常已经说。
感谢您丰富多彩的答案!但是对于我来说,为什么有些控制器没有这个顺序的麻烦,还有一些人会这么做,他们都没有提供静态文件。 –
请从控制器发布一些导致“麻烦”的代码。 –
就是这样。来自控制器的代码不会造成任何麻烦,因为调用永远不会到达控制器。之前发生异常。 –
我之所以要求控制器代码是因为与以前的现有控制器相比,可能有些东西使它“特殊”。像路线注释,特殊命名或其他... –