从 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。通过一些额外的工作,您可以将它变成一个扩展方法。