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

本文关键字:路由 项目 WebApi+Odata | 更新日期: 2023-09-27 18:17:14

我正在重新实现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’。"}

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

您可以使用路由属性来实现这一点:

  1. 使用ODataRouteAttribute类:

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

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

默认情况下,OData将搜索EDM模型中定义的annotation_shared_withController。因为你的控制器被命名为AnnotationSharedWithController,它将返回404

重命名你的控制器类可以解决这个问题。但是你最终会得到混乱的类名。

你可以实现你自己的路由约定,参见ASP中的路由约定。. NET Web API 2 Odata获取更多详细信息

希望能有所帮助。