如何在WebApi + Odata项目中更改路线

时间:2016-11-10 15:02:50

标签: c# asp.net-web-api2 odata

我正在重新实现WCF服务,我选择使用WebAPI 2.2 + OData v4。 我面临的问题是我需要包含'_'的路由,而我无法实现它。 目前我有这个:

public class AnnotationSharedWithController : ODataController
{
    ...
    [EnableQuery]
    public IQueryable<AnnotationSharedWith> Get()
    {
        return _unitOfWork.AnnotationSharedWith.Get();
    }
    ...
}

我的WebApiConfig.cs看起来像这样:

public static void Register(HttpConfiguration config)
{
    config.MapODataServiceRoute("webservice",null,GenerateEdmModel());
        config.Count();
}

private static IEdmModel GenerateEdmModel()
{
    var builder = new ODataConventionModelBuilder();
    builder.EntitySet<AnnotationSharedWith>("annotation_shared_with");
        return builder.GetEdmModel();
}

当我发出GET请求时,我收到以下错误

  

{“Message”:“找不到与请求URI匹配的HTTP资源   'http://localhost:12854/annotation_shared_with'。“,”MessageDetail“:   “没有找到与命名控制器匹配的类型   'annotation_shared_with'。“}

2 个答案:

答案 0 :(得分:0)

默认情况下,OData将搜索您的EDM模型中定义的annotation_shared_withController。由于您的控制器名为AnnotationSharedWithController,因此将返回404

重新编写控制器类将解决此问题。但是你最终会得到凌乱的类名。

您可以实现自己的路由约定,请参阅 Routing Conventions in ASP.NET Web API 2 Odata了解更多详情

希望它有所帮助。

答案 1 :(得分:0)

您可以使用路由属性来实现此目的:

  1. 使用ODataRouteAttribute类:

    public class AnnotationSharedWithController : ODataController
    {
        [EnableQuery]
        [ODataRouteAttribute("annotation_shared_with")]
        public IQueryable<AnnotationSharedWith> Get()
        {
            //your code
        }
    }
    
  2. 使用ODataRoutePrefixAttributeODataRouteAttribute类:

    [ODataRoutePrefixAttribute("annotation_shared_with")]
    public class AnnotationSharedWithController : ODataController
    {
        [EnableQuery]
        [ODataRouteAttribute("")]
        public IQueryable<AnnotationSharedWith> Get()
        {
            //your code
        }
    }