【问题标题】:WebApi OData HttpConfiguration Extension methods missing缺少 WebApi OData HttpConfiguration 扩展方法
【发布时间】:2016-11-15 16:50:57
【问题描述】:

我似乎缺少 OData v4 HttpConfiguration 扩展方法。这是我的 Web API 注册方法:

    public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        // Use camel case for JSON data.
        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

        config.EnableCaseInsensitive();

        config.Count().Filter().OrderBy().Expand().Select().MaxTop(null);            
        config.MapODataServiceRoute("odata", "api", OdataConfig.GetEdm());

        config.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{id}",
         defaults: new { id = RouteParameter.Optional }
     );

    }
}

System.Web.Odata(.Extensions) 中完全缺少 EnableCaseInsensitive()EnableEnumPrefixFree() 等方法。

它们存在于documentationsource code 中的程序集,但是在探索我拥有的程序集时,它们完全丢失了:

我多次尝试从 Nuget 重新安装 OData - 我似乎找不到其他人遇到此问题。准备拔掉我的头发。有任何想法吗?

【问题讨论】:

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


    【解决方案1】:

    我认为降级不是一个好的解决方案:D

    API已改为依赖注入:http://odata.github.io/WebApi/#13-04-DependencyInjection

    您必须执行以下操作: (示例)

    public static void Register(HttpConfiguration config)
    {
        // OData
        config.Count().Filter().OrderBy().Expand().Select().MaxTop(null);
    
        config.MapODataServiceRoute("odata", "odata", BuildRoute);
    }
    
    private static void BuildRoute(IContainerBuilder builder)
    {
        builder
            .AddService(ServiceLifetime.Singleton, s => GetEdmModel())
            .AddService<IEnumerable<IODataRoutingConvention>>(ServiceLifetime.Singleton, s => ODataRoutingConventions.CreateDefault())
            .AddService<ODataUriResolver>(ServiceLifetime.Singleton, s => new CaseInsensitiveODataUriResolver());
    }
    

    我的解析器类如下所示:

    public class CaseInsensitiveODataUriResolver : UnqualifiedODataUriResolver
    {
        public override bool EnableCaseInsensitive
        {
            get
            {
                return true;
            }
    
            set
            {
            }
        }
    }
    

    您可以从ODataUriResolverUnqualifiedODataUriResolverStringAsEnumResolver 派生。

    不可能写出类似的东西

    s => new ODataUriResolver { EnableCaseInsensitive = true }
    

    另请参阅 https://github.com/OData/WebApi/issues/812https://github.com/OData/WebApi/issues/853

    【讨论】:

    • 这是一个比 OP 自己接受的答案更好的答案。
    • 这对于社区来说可能是一个更好的答案,但它不适合我——这是我尝试过的但实际上并没有奏效的事情之一。 (很久以前的事了,具体原因不记得了)
    【解决方案2】:

    啊啊啊,我在这里发帖后,我就明白了。通过将 Nuget 包降级到 5.9.1,我最终得到了丢失的部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      相关资源
      最近更新 更多