【问题标题】:Static files and oData静态文件和 oData
【发布时间】:2019-08-18 08:48:21
【问题描述】:

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

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

index.html 受到打击,但是当 Angular 在 app-root 元素中引用它的 js 文件(例如 runtime.jspolyfils.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)。有没有人经历过发生了什么,出了什么问题?

【问题讨论】:

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


    【解决方案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 核心中,您可以通过错误的方法调用顺序真正影响应用程序的行为。也许这在某处讨论过?

    【讨论】:

    • ~ has no special meaning浏览器中。 ~/ 不是相对于根的 URL。在一些非常古老的服务器中,~ 用于引用 用户的 主目录。如果您使用浏览器的开发工具,我敢打赌您会看到 浏览器~ 视为一个简单的前缀,因此所有相对 URL 最终都会引用 www.mysite.com/ViewName/~/ 并被路由到视图的控制器
    • 嗯,我们使用它是因为我们在 MS 自己的网站 docs.microsoft.com/en-us/aspnet/core/fundamentals/… 上将其作为推荐阅读,但我想你是对的。
    • 那篇文章在元素 URL 中使用了~。结果地址是相对于 HTML 页面的基础的。 &lt;base href="~/"&gt; 虽然将 base 更改为其他内容。使用浏览器中的网络视图或 Fiddler 等调试代理来检查浏览器实际请求了哪些 URL
    猜你喜欢
    • 2014-10-13
    • 2010-10-29
    • 2017-05-15
    • 2013-01-15
    • 2014-07-30
    • 2016-03-12
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多