OData已过时代码

时间:2017-10-19 15:19:10

标签: c# odata

我正在尝试按照本教程创建OData服务。我正在看这个关于导航属性的主题:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/entity-relations-in-odata-v4

似乎有些代码已过时(文章来自2014年,但我使用的是Visual Studio 2017)。

我的Helper课上有很多红色下划线:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web.Http.Routing;
using System.Web.OData.Extensions;
using System.Web.OData.Routing;
using Microsoft.OData;
using Microsoft.OData.UriParser;

namespace ProductService
{
    public static class Helpers
    {
        public static TKey GetFromUri<TKey>(HttpRequestMessage request, Uri uri)
        {
            if(uri == null)
                throw new ArgumentException("uri");

            var urlHelper = request.GetUrlHelper() ?? new UrlHelper(request);

            string serviceRoot = urlHelper.CreateODataLink(
            request.ODataProperties().RouteName,
            request.ODataProperties().PathHandler, new List<ODataPathSegment>());

            var odataPath = request.ODataProperties().PathHandler.Parse(
                request.ODataProperties().Model,
                serviceRoot, uri.LocalPath);

            var keySegment = odataPath.Segments.OfType<KeyValuePathSegment>()
                .FirstOrDefault();
            if (keySegment == null)
                throw new InvalidOperationException("The link does not contain a key.");

            var value = ODataUriUtils.ConvertFromUriLiteral(keySegment.Value,
                ODataVersion.V4);
            return (TKey)value;
        }
    }
}

我在这个类上有三段代码有问题:

request.ODataProperties().PathHandler

request.ODataProperties().Model

我收到错误:

  

'HttpRequestMessageProperties'不包含'PathHandler'的定义,也没有扩展方法......

它也无法找到 KeyValuePathSegment 类。

有没有办法重写这个类以使其保持最新状态?

2 个答案:

答案 0 :(得分:3)

@ Pizzor2000

Web API OData库中从5.x到6.x版本引入了一些重大更改。您可以从发布说明中找到所有更改:https://github.com/OData/WebApi/releases/tag/v6.0.0

您的示例:

您可以调用扩展方法来获取原始属性,例如:

https://github.com/OData/WebApi/blob/master/src/System.Web.OData/Extensions/HttpRequestMessageExtensions.cs#L307获取IEdmModel

https://github.com/OData/WebApi/blob/master/src/System.Web.OData/Extensions/HttpRequestMessageExtensions.cs#L352获取PathHandler

此外,KeyValuePathSegment被删除,Web API OData使用https://github.com/OData/odata.net/blob/master/src/Microsoft.OData.Core/UriParser/SemanticAst/KeySegment.cs#L22代替。

希望它可以帮到你。

答案 1 :(得分:0)

希望可以节省一些时间,我在这里发布了用新API纠正的同一段代码。

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.OData.Extensions;
using Microsoft.AspNetCore.Http;
using Microsoft.OData;
using Microsoft.OData.UriParser;

namespace ProductService
{
    
    public static class Helpers
    {
        public static TKey GetKeyFromUri<TKey>(HttpRequest request, Uri uri)
        {
            if (uri == null)
            {
                throw new ArgumentNullException("uri");
            }

            var oDataPathHandler = request.GetPathHandler();
            var oDataLink = request.GetUrlHelper().CreateODataLink(request.ODataFeature().RouteName, oDataPathHandler, new List<ODataPathSegment>());
            var odataPath = oDataPathHandler.Parse(oDataLink, uri.AbsoluteUri, request.GetRequestContainer());

            var keySegment = odataPath.Segments.OfType<KeySegment>().FirstOrDefault();
            if (keySegment?.Keys == null || !keySegment.Keys.Any())
            {
                throw new InvalidOperationException("The link does not contain a key.");
            }

            return (TKey)keySegment.Keys.FirstOrDefault().Value;
        }
    }
}