静态文件和oData

时间:2019-03-27 17:18:11

标签: c# asp.net-core odata wwwroot

我们有一个asp组合。网络核心odata作为后端,而Angular 6作为前端。两者都是分别开发的,在每个发行版中,Angular文件都将复制到 wwwroot 文件夹中。我们在Startup.Configure中添加了这两种方法,以允许读取静态文件:

app.UseDefaultFiles();
app.UseStaticFiles();

index.html 受到打击,但是当Angular引用 app-root 元素(例如 runtime.js polyfils.js ),我们会收到500错误:

  

处理请求时发生未处理的异常。   AmbiguousActionException:多个动作匹配。以下操作与路线数据匹配,并且满足所有约束条件:   SomeNamespace.API.Controllers.ProductRequestController.GetProductRequest(SomeNamespace.API)   SomeNamespace.API.Controllers.UserProfileController.GetUserProfile(SomeNamespace.API)   SomeNamespace.API.Controllers.UserRoleCategoryController.GetUserRoleCategory(SomeNamespace.API)   SomeNamespace.API.Controllers.WorkflowStepController.GetWorkflowStep(SomeNamespace.API)   Microsoft.AspNetCore.Mvc.Internal.ActionSelector.SelectBestCandidate(RouteContext上下文,IReadOnlyList候选对象)

似乎index.html也被其他ASP击中。网络核心有服务其他文件的问题。我们还在头部设置了正确的(我们认为)基本路径:

<base href="~/">

看起来实际上不是在简单地提供文件应用程序,而是试图找到合适的控制器(在这种情况下为odata)。有没有人经历过正在发生的事情和出了什么问题?

1 个答案:

答案 0 :(得分:1)

好的,所以经过一些额外的谷歌搜索和拼命玩耍之后,我们得到了可行的解决方案。有两件事:

  1. 必须与odata one一起添加其他路由
  2. 这太疯狂了!在路由之前,必须先调用两种支持静态文件的方法。

所以最终看起来像这样:

app.UseDefaultFiles();
app.UseStaticFiles();

app.UseHttpsRedirection();
app.UseMvc(routeBuilder =>
   {
      routeBuilder.MapODataServiceRoute("ODataRoutes", "odata", modelBuilder.GetEdmModel(app.ApplicationServices));
      routeBuilder.MapRoute(
         name: "angular", 
         template: "{*url}",
         defaults: new {controller = "Home", action = "Index"});
    });

我认为这没问题,至少应该在文档中的某处提到它。看起来在asp.net核心中,您实际上可以通过错误的方法调用顺序来影响应用程序的行为。也许这是在某个地方讨论的?