结合OData和.NET API开发Angular SPA应用程序
我正在创建一个项目,该项目将有一个与.net核心Web Api项目对话的角度前端,使用OData提供丰富的查询。 我已经将OData Nuget包添加到我的angular项目中 我遵循了以下教程: 在myStartup.cs中结合OData和.NET API开发Angular SPA应用程序,angular,.net-core,odata,Angular,.net Core,Odata,我正在创建一个项目,该项目将有一个与.net核心Web Api项目对话的角度前端,使用OData提供丰富的查询。 我已经将OData Nuget包添加到我的angular项目中 我遵循了以下教程: 在myStartup.cs中 public void ConfigureServices(IServiceCollection services) { services.AddSpaStaticFiles(configuration => {
public void ConfigureServices(IServiceCollection services)
{
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
/* snipped some code about DbContext and AutoMapper, not relevant */
services.AddMvcCore(action => action.EnableEndpointRouting = false)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddOData();
services.AddODataQueryFilter();
}
private static IEdmModel GetEdmModel()
{
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Asset>("Assets");
return builder.GetEdmModel();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseMvc(routes =>
{
routes.EnableDependencyInjection();
routes.Select().Filter().OrderBy().Expand().Count().MaxTop(10);
routes.MapODataServiceRoute("api", "api", GetEdmModel());
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
app.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
}
问题2
如果我将此代码再次添加到类中,则会发生以下情况:
呼叫?$count=true
应返回如下列表:
{
"@odata.context": "https://localhost:44374/api/$metadata#Assets",
"@odata.count": 2,
"value": [
{
"Id": "9cef40f6-db31-4d4c-997d-8b802156dd4c",
"Name": "Asset 1",
},
{
"Id": "282be5ea-231b-4a59-8250-1247695f16c3",
"Name": "Asset 2",
}
]
}
但是,该端点返回:
[
{
"Id": "9cef40f6-db31-4d4c-997d-8b802156dd4c",
"Name": "Asset 1",
},
{
"Id": "282be5ea-231b-4a59-8250-1247695f16c3",
"Name": "Asset 2",
}
]
有人知道发生了什么或我做错了什么吗?试着删除这行:
routes.EnableDependencyInjection();
尝试删除此行:
routes.EnableDependencyInjection();
现在我遇到了这个错误:“找不到非OData路由的服务容器。在非OData路由上使用OData组件时可能会发生这种情况,这通常是一个配置问题。调用EnableDependencyInjection()在非OData路由上启用OData组件。当ASP.NET核心路由层而不是OData路由层错误地处理请求时,也可能会发生这种情况,例如URL不包括通过调用MapODataServiceRoute()配置的OData路由前缀。因此我还尝试删除[route(“api/[controller]”)从我的控制器类,但url“/api/Assets/All”不再解决这些问题。我怀疑路由错误是问题的核心。如果删除默认Mvc路由,并从控制器类中删除RouteAttribute,则我的“/api/Assets/All”将不再解析,只加载整个angular应用程序。似乎行“MapODataServiceRoute(“api”,“api”,GetEdmModel())没有任何作用。我正面临着确切的问题!你有没有想过?我还注意到,例如,返回所有my对象,减去任何其他导航属性。但是,Objectors属性始终为空。现在我遇到以下错误:“找不到非OData路由的服务容器。在非OData路由上使用OData组件时可能会发生这种情况,这通常是一个配置问题。调用EnableDependencyInjection()在非OData路由上启用OData组件。当ASP.NET核心路由层而不是OData路由层错误地处理请求时,也可能会发生这种情况,例如URL不包括通过调用MapODataServiceRoute()配置的OData路由前缀。因此我还尝试删除[route(“api/[controller]”)从我的控制器类,但url“/api/Assets/All”不再解决这些问题。我怀疑路由错误是问题的核心。如果删除默认Mvc路由,并从控制器类中删除RouteAttribute,则我的“/api/Assets/All”将不再解析,只加载整个angular应用程序。似乎行“MapODataServiceRoute(“api”,“api”,GetEdmModel())没有任何作用。我正面临着确切的问题!你有没有想过?我还注意到,例如,返回所有my对象,减去任何其他导航属性。但是,“目标”属性始终为空。
routes.EnableDependencyInjection();