从 CreateRef 中的 Uri 获取密钥(.NET Core 6 OData)
Get key from Uri in CreateRef (.NET Core 6 OData)
升级到 OData 8 时,无法找到从 URI 获取密钥以进行导航的方法 属性。
我正在使用 Microsoft 的 Asp.Versioning.OData and following this guide 预览包从 Uri 获取密钥。此 guid 有一个方法 Helpers.GetKeyFromUri()
但对于 OData v8,它缺少许多扩展方法,例如 GetUrlHelper()
或 KeyValuePathSegment
.
等类型
在 OData 8 和 .net core 6 中使用 Asp.Versioinng.OData 时,是否有从 Uri 中提取密钥的新方法?
我也提到了它 source with examples 但它没有实现如何从 Uri 中获取密钥。
@soccer7,您所指的 指南 适用于带有 ASP.NET Web API (2.2) 的 OData。这不适用于具有 ASP.NET 核心的 OData。
OData 文档似乎没有更新如何提取密钥。 可能还有其他方法,但以下肯定有效:
[HttpPut]
public IActionResult CreateRef(
int key,
string navigationProperty,
[FromBody] Uri link )
{
var feature = HttpContext.ODataFeature();
var model = feature.Model;
var serviceRoot = new Uri( new Uri( feature.BaseAddress ), feature.RoutePrefix );
var requestProvider = feature.Services;
var parser = new ODataUriParser( model, serviceRoot, link, requestProvider );
parser.Resolver ??= new UnqualifiedODataUriResolver() { EnableCaseInsensitive = true };
parser.UrlKeyDelimiter = ODataUrlKeyDelimiter.Slash;
var path = parser.ParsePath();
var segment = path.OfType<KeySegment>().Single();
var otherKey = segment.Keys.Single().Value; // note: could have multiple keys
// TODO: use 'otherKey'
return NoContent();
}
它进行了一些探索,但这是基于 OData 解析路径的方式(如 here 所示)。不清楚为什么,但是相应的接口和实现都被标记为internal
。通过一些额外的工作,您可以将它变成一个扩展方法。
升级到 OData 8 时,无法找到从 URI 获取密钥以进行导航的方法 属性。
我正在使用 Microsoft 的 Asp.Versioning.OData and following this guide 预览包从 Uri 获取密钥。此 guid 有一个方法 Helpers.GetKeyFromUri()
但对于 OData v8,它缺少许多扩展方法,例如 GetUrlHelper()
或 KeyValuePathSegment
.
在 OData 8 和 .net core 6 中使用 Asp.Versioinng.OData 时,是否有从 Uri 中提取密钥的新方法?
我也提到了它 source with examples 但它没有实现如何从 Uri 中获取密钥。
@soccer7,您所指的 指南 适用于带有 ASP.NET Web API (2.2) 的 OData。这不适用于具有 ASP.NET 核心的 OData。
OData 文档似乎没有更新如何提取密钥。 可能还有其他方法,但以下肯定有效:
[HttpPut]
public IActionResult CreateRef(
int key,
string navigationProperty,
[FromBody] Uri link )
{
var feature = HttpContext.ODataFeature();
var model = feature.Model;
var serviceRoot = new Uri( new Uri( feature.BaseAddress ), feature.RoutePrefix );
var requestProvider = feature.Services;
var parser = new ODataUriParser( model, serviceRoot, link, requestProvider );
parser.Resolver ??= new UnqualifiedODataUriResolver() { EnableCaseInsensitive = true };
parser.UrlKeyDelimiter = ODataUrlKeyDelimiter.Slash;
var path = parser.ParsePath();
var segment = path.OfType<KeySegment>().Single();
var otherKey = segment.Keys.Single().Value; // note: could have multiple keys
// TODO: use 'otherKey'
return NoContent();
}
它进行了一些探索,但这是基于 OData 解析路径的方式(如 here 所示)。不清楚为什么,但是相应的接口和实现都被标记为internal
。通过一些额外的工作,您可以将它变成一个扩展方法。