元数据与WebAPi OData属性路由不起作用

时间:2014-09-10 18:25:29

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

我正在为OData端点使用OData属性路由。这是我的一个例子:

[ODataRoutePrefix("Profile")]
public class ProfileODataController : ODataController
{
    [ODataRoute]
    [EnableQuery]
    public IHttpActionResult Get()
    {
        var repo = new Repositories.ProfileRepository();

        return Ok(repo.GetProfiles());
    }

    [ODataRoute("({key})")]
    [EnableQuery]
    public IHttpActionResult Get([FromODataUri] string key)
    {
        var repo = new Repositories.ProfileRepository();

        var result = repo.GetProfiles().SingleOrDefault(x => x.Id== key);
        if (result == null) return NotFound();

        return Ok(result);
    }
}

这是我的设置:

config.MapODataServiceRoute("odata", "odata", ModelGenerator.GetEdmModel());

这是我的EdmModel代:

public static IEdmModel GenerateEdmModel()
{
    var builder = new ODataConventionModelBuilder();

    builder.EntitySet<Profile>("Profile").EntityType.HasKey(x => x.Id);

    return builder.GetEdmModel();
}

网址/odata/Profile/odata/Profile('someid')都有效,但当我尝试访问$ metadata端点(/odata/$metadata#Profile)时,出现以下错误:

  

{“消息”:“找不到与请求URI匹配的HTTP资源'http:// **** / odata / $ metadata'。”,“MessageDetail”:“否找到的类型与名为“元数据”的控制器匹配。“}

我是否需要创建控制器/操作来提供元数据?如果是,那该行动是如何实施的?

1 个答案:

答案 0 :(得分:6)

原来这与我替换IAssembliesResolver有关。

我已经实现了一个自定义版本,只提供我已实现控制器的组件程序集。但是,正如错误所述,它无法找到名为{{1}的控制器}。事实证明,OData实现了一个:MetadataController,它提供System.Web.OData.MetadataController关键字。

由于我已经实现了自己的$metadata,因此IAssembliesResolver程序集未被包含,System.Web.OData失败。一旦我发现了这个,并更新了我的程序集解析器以明确包含OData程序集,它现在可以正常工作。