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