我正在尝试按照本教程创建OData服务。我正在看这个关于导航属性的主题:
似乎有些代码已过时(文章来自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 类。
有没有办法重写这个类以使其保持最新状态?
答案 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#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;
}
}
}