我收到以下错误:
控制器"客户端"中操作"GetClients"上的路径模板"GetClients()"不是有效的OData路径模板.找不到"GetClients"细分受众群的资源.
我的控制器方法看起来像这样
public class ClientsController : ODataController
{
[HttpGet]
[ODataRoute("GetClients(Id={Id})")]
public IHttpActionResult GetClients([FromODataUri] int Id)
{
return Ok(_clientsRepository.GetClients(Id));
}
}
Run Code Online (Sandbox Code Playgroud)
我的WebAPIConfig文件有
builder.EntityType<ClientModel>().Collection
.Function("GetClients")
.Returns<IQueryable<ClientModel>>()
.Parameter<int>("Id");
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: "odata",
model: builder.GetEdmModel());
Run Code Online (Sandbox Code Playgroud)
我希望能够像这样调用odata rest api:
http://localhost/odata/GetClients(Id=5)
Run Code Online (Sandbox Code Playgroud)
知道我做错了什么吗?
c# odata asp.net-web-api asp.net-web-api-routing asp.net-web-api-odata
背景/环境:
我们有两条路线,路线前缀不同:
/api/api/partial目前,我们对两个路由前缀使用相同的EdmModel.(参见第一个代码snippit,名为"我们目前正在做什么").
我们想要什么:
我们只需要为路由2允许API功能的子集:/api/partial.404当有人试图访问"部分"EdmModel不可用的API时,我们希望返回
例:
404的/api/parial/products,其中products没有在这个"局部" API路线定义./api/products到控制器方法我们尝试过的:
使用第二个EdmModel,它只包含完整EdmModel中可用实体的子集.(参见第二个代码snippit,名为"我们想做什么:".)
问题:
我们在服务启动时遇到错误:
The path template 'products' on the action 'Export' in controller 'Products' is not a valid OData path template. Resource not found for the segment 'products'.)
我最好的猜测是,.NET OData库会扫描所有OData控制器,函数和操作,并期望每个路由都在EdmModel中明确定义它们.如果这是真的,那么这个解决方案(初始化一个新的EdmModel)可能不会起作用......
这不受支持吗?如果没有,还有什么其他选择来实现这一目标?我们必须在控制器API函数中显式返回404吗?这需要分析API函数中"api/subset"的路径,这在我看来就像是一个hack.
我们目前的工作:
private static IEdmModel GetFullEdmModel()
{
var builder = new ODataConventionModelBuilder();
var orders = builder.EntitySet<Order>("orders");
orders.EntityType.HasKey(o => o.Id);
orders.EntityType.Property(o => o.Id).Name = "id"; …Run Code Online (Sandbox Code Playgroud)