相关疑难解决方法(0)

控制器中操作的路径模板不是有效的OData路径模板

我收到以下错误:

控制器"客户端"中操作"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

10
推荐指数
1
解决办法
2万
查看次数

仅为路由公开.NET OData API的子集(对于排除的API,返回404)

背景/环境:

我们有两条路线,路线前缀不同:

  1. 路线1前缀: /api
  2. 路线2前缀: /api/partial

目前,我们对两个路由前缀使用相同的EdmModel.(参见第一个代码snippit,名为"我们目前正在做什么").

我们想要什么:

我们只需要为路由2允许API功能的子集:/api/partial.404当有人试图访问"部分"EdmModel不可用的API时,我们希望返回

例:

  1. 我们希望返回404/api/parial/products,其中products没有在这个"局部" API路线定义.
  2. 我们仍希望路由/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)

.net c# odata asp.net-web-api asp.net-web-api-routing

9
推荐指数
1
解决办法
197
查看次数