我正在为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”:“否找到的类型与名为“元数据”的控制器匹配。“}
我是否需要创建控制器/操作来提供元数据?如果是,那该行动是如何实施的?
答案 0 :(得分:6)
原来这与我替换IAssembliesResolver
有关。
我已经实现了一个自定义版本,只提供我已实现控制器的组件程序集。但是,正如错误所述,它无法找到名为{{1}的控制器}。事实证明,OData实现了一个:MetadataController
,它提供System.Web.OData.MetadataController
关键字。
由于我已经实现了自己的$metadata
,因此IAssembliesResolver
程序集未被包含,System.Web.OData
失败。一旦我发现了这个,并更新了我的程序集解析器以明确包含OData程序集,它现在可以正常工作。