【问题标题】:$Metadata with WebAPi OData Attribute Routing Not Working$Metadata 与 WebAPi OData 属性路由不工作
【发布时间】:2014-09-10 18:25:28
【问题描述】:

我正在为 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) 时,出现以下错误:

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

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

【问题讨论】:

  • 你能发一下你的ModelGeneratlr.GetEdmModel()吗?
  • 在您的代码中没有发现什么特别之处。无需额外操作即可提供元数据。您应该能够使用.../odata/?$metadata.../odata/$metadata 查看元数据。
  • @Blaise 正如我所料,但事实并非如此。我使用任何一个 url 都会遇到同样的错误。

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


【解决方案1】:

原来这与我更换 IAssembliesResolver 有关。

我实现了一个自定义版本,只提供我在其中实现控制器的 组件 程序集。但是,正如错误所说,它找不到名为 MetadataController 的控制器。事实证明,OData 实现了一个:System.Web.OData.MetadataController,它提供了$metadata 关键字。

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

【讨论】:

  • 遇到了完全相同的问题,感谢 Natha 的洞察
猜你喜欢
  • 2015-09-09
  • 2013-03-27
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2016-12-17
相关资源
最近更新 更多