Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态文件和oData_C#_Asp.net Core_Odata_Wwwroot - Fatal编程技术网

C# 静态文件和oData

C# 静态文件和oData,c#,asp.net-core,odata,wwwroot,C#,Asp.net Core,Odata,Wwwroot,我们有一个asp的组合。网芯odata作为后端,棱角6作为前端。两者都是单独开发的,在每个版本中,角度文件都复制到wwwroot文件夹。我们将这两种方法添加到启动中。配置为允许读取静态文件: app.UseDefaultFiles(); app.UseStaticFiles(); index.html受到攻击,但是当Angular在应用程序根元素(例如runtime.js或polyfils.js)中引用它的js文件时,我们得到500个错误: 处理请求时发生未处理的异常。 AmbiguousAc

我们有一个asp的组合。网芯odata作为后端,棱角6作为前端。两者都是单独开发的,在每个版本中,角度文件都复制到wwwroot文件夹。我们将这两种方法添加到启动中。配置为允许读取静态文件:

app.UseDefaultFiles();
app.UseStaticFiles();
index.html受到攻击,但是当Angular在应用程序根元素(例如runtime.js或polyfils.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.SelectBestCandidates(RouteContext上下文,IReadOnlyList候选项)

看起来,甚至index.html也会受到其他asp。net核心在服务其他文件时出现问题。我们还在head中设置了正确的(我们认为)基本路径:

<base href="~/">


看起来,应用程序并不是简单地为文件提供服务,而是试图找到合适的控制器(在本例中是odata)。有没有人经历过发生了什么事,出了什么问题?

好吧,在谷歌搜索和绝望的游戏之后,我找到了有效的解决方案。所以有两件事:

  • 不得不在odata one的基础上增加额外的路由
  • 这一个太疯狂了!路由之前必须调用两种支持静态文件的方法
  • 所以最后看起来是这样的:

    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 core It中,您可以通过错误的方法调用顺序来影响应用程序的行为。也许在某个地方讨论过这个问题?

    ~
    在浏览器中<代码>~/不是根相对URL。在一些非常旧的服务器中,
    ~
    用于引用用户的主目录。如果您使用浏览器的开发工具,我打赌您会看到浏览器将
    ~
    视为一个简单的前缀,因此所有相关URL最终都指向
    www.mysite.com/ViewName/~/
    ,并被路由到视图的controllerHm,我们之所以使用它,是因为我们在微软自己的网站上把它作为推荐阅读,但我想你是对的。那篇文章在元素URL中使用了
    ~
    。生成的地址是相对于HTML页面的底部的<代码>虽然将基础更改为其他内容。使用浏览器中的网络视图或调试代理(如Fiddler)检查浏览器实际请求的URL