2014-09-10 74 views
3

我对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(); 
} 

的URL /odata/Profile/odata/Profile('someid')都工作,但是当我尝试访问$元数据端点(/odata/$metadata#Profile)时,出现以下错误:

{"Message":"No HTTP resource was found that matches the request URI 'http://****/odata/$metadata'.","MessageDetail":"No type was found that matches the controller named 'Metadata'."}

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

+0

你可以发表你的'ModelGeneratlr.GetEdmModel()'吗? – Blaise 2014-09-12 14:32:11

+0

@Blaise发表。 – 2014-09-12 17:23:09

+0

你的代码没有什么特别的。不需要额外的操作来提供元数据。您应该可以使用'.../odata /?$ metadata'和'.../odata/$ metadata'查看元数据。 – Blaise 2014-09-12 19:47:42

回答

5

原来,这与我对IAssembliesResolver的更换有关。

我已经实现了一个定制版本,只提供组件,我已经在实施控制器组件。但是,作为错误说,它不能找到一个名为MetadataController控制器。原来,OData实现了一个:System.Web.OData.MetadataController,它提供了$metadata关键字。

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

+0

有完全相同的问题,感谢有识之士娜塔 – 2016-03-30 12:18:18