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

Nat*_*n A 3 c# odata asp.net-web-api 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的设置:

config.MapODataServiceRoute("odata", "odata", ModelGenerator.GetEdmModel());
Run Code Online (Sandbox Code Playgroud)

这是我的EdmModel代:

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

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

    return builder.GetEdmModel();
}
Run Code Online (Sandbox Code Playgroud)

网址 /odata/Profile/odata/Profile('someid')两者都有效,但是当我尝试访问$ metadata endpoint(/odata/$metadata#Profile)时,我收到以下错误:

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

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

Nat*_*n A 6

原来它与我的替换有关IAssembliesResolver.

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

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