【发布时间】:2017-06-30 19:11:26
【问题描述】:
使用 .net Core 1.1 和 Microsoft.AspNetCore.OData 库,我可以让 OData 端点与我的简单控制器一起执行 get、$expand 和其他查询。但是,我无法让它返回要返回的 $metadata。这个问题 ($Metadata with WebAPi OData Attribute Routing Not Working) 是针对同一个问题的,但是自发布以来,.Net API 发生了变化。
我需要启用设置、标志或其他东西吗?
这(http://localhost:52315/odata)似乎返回了元数据,
{
"@odata.context":"http://localhost:52315/odata/$metadata","value":[
{
"name":"Users","kind":"EntitySet","url":"Users"
},{
"name":"HelloComplexWorld","kind":"FunctionImport","url":"HelloComplexWorld"
}
]
}
这个 (http://localhost:52315/odata/$metadata) 给了我错误:
An unhandled exception occurred while processing the request.
NotSupportedException: No action match template '$metadata'
in 'MetadataController'
Microsoft.AspNetCore.OData.Routing.Conventions.DefaultODataRoutingConvention.SelectAction(RouteContext routeContext)
我的 Startup.cs 如下所示:
public void Configure(IApplicationBuilder app) {
app.UseDeveloperExceptionPage();
app.UseOData("odata");
app.UseMvcWithDefaultRoute();
}
public void ConfigureServices(IServiceCollection services) {
services.AddMvc().AddWebApiConventions();
services.AddSingleton<ISampleService, ApplicationDbContext>();
services.AddOData<ISampleService>(builder =>
{
builder.Namespace = "Sample";
builder.EntityType<ApplicationUser>();
builder.EntityType<Product>();
builder.Function("HelloComplexWorld").Returns<Permissions>();
});
}
注意:我可以通过在我的 ConfigureServices(...) 方法的开头添加它来解决这个问题,但考虑到 $metadata 支持应该是核心平台的一部分,这似乎是错误的。
app.Use(async (context, next) => {
if (0 == string.Compare(context.Request.Path, @"/odata/$metadata", true)) {
context.Request.Path = "/odata";
}
await next.Invoke();
});
【问题讨论】:
标签: c# asp.net-web-api asp.net-core odata .net-core