1

我们有一个asp的组合。net core odata 作为后端,Angular 6 作为前端。两者都是单独开发的,在每个发布期间,Angular 文件都被复制到wwwroot文件夹。我们将这两个方法添加到 Startup.Configure 以允许读取静态文件:

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

index.html受到打击,但是当 Angular 在app-root元素(例如runtime.jspolyfils.js)中引用它的 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 context, IReadOnlyList 候选人)

似乎甚至 index.html 也被其他 asp 击中。net core 在提供其他文件时存在问题。我们还在 head 中设置了正确的(我们认为的)基本路径:

<base href="~/">

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

4

1 回答 1

1

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

  1. 必须与 odata 一起添加额外的路由
  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 核心中,您可以通过错误的方法调用顺序真正影响应用程序的行为。也许这在某处讨论过?

于 2019-03-27T17:25:37.790 回答