未找到该段

时间:2016-11-10 01:11:37

标签: c# asp.net asp.net-web-api odata

以下OData配置引发错误消息:" ...找不到该段的资源..."。

var builder = new ODataConventionModelBuilder
{
    Namespace = "Company",
    ContainerName = "CompanyContainer"
};

builder.EntitySet<ModelA>("AModels");
builder.EntitySet<ModelB>("BModels");
builder.EntitySet<ModelC>("CModels");

// EDIT register GlobalStats as a ComplexType
builder.ComplexType<GlobalStats>();

builder.Function("Functions.GlobalStats").Returns<GlobalStats>();

var edmModel = builder.GetEdmModel();

config.MapODataServiceRoute(routeName: "Default", routePrefix: "odata", model: edmModel);

和控制器:

public class GlobalController : CompanyController
{
    [HttpGet]
    [ODataRoute("Company.Functions.GlobalStats")]
    public async Task<IHttpActionResult> GetGlobalStats()
    {
        var stats = await Company.GlobalStats.GetAsync();
        return Ok(stats);
    }
}

我们的想法是拥有如下所示的端点:

http://api.company.com/odata/Company.Functions.GlobalStats

请帮我弄清楚这个配置中缺少什么。

编辑#1

我还尝试将GlobalStats注册为ComplexType。仍然没有运气。

编辑#2

以下是确切的错误消息:

  

类型的例外   &#39; System.InvalidOperationException&#39;发生在System.Web.OData.dll中   但未在用户代码中处理。

     

其他信息:路径模板   &#39; Company.Functions.GlobalStats&#39;关于行动&#39; GetGlobalStats&#39;在   控制器&#39; Global&#39;不是有效的OData路径模板。资源没有   找到了细分&#39; Company.Functions.GlobalStats&#39;。

2 个答案:

答案 0 :(得分:0)

  1. 定义未绑定的函数:

    modelBuilder.Function("Company.Functions.GlobalStats").Returns<GlobalStats>();
    
  2. 映射你的odata路线:

    config.MapODataServiceRoute("ODataRoute", "odata", model); 
    
  3. 在控制器中为方法定义路由属性:

    [HttpGet]
    [ODataRoute("Company.Functions.GlobalStats")]
    public async Task<IHttpActionResult> GetGlobalStats()
    {
        // your code
    }
    
  4. 使用http://host/odata/Company.Functions.GlobalStats

  5. 进行调用

答案 1 :(得分:0)

调用未绑定函数应该只在服务根之后使用未绑定的函数名,而不管名称空间。