如何在普通的ApiController中手动从oData查询字符串填充ODataQueryOptions?

3

我正在使用一个ApiController(而不是ODataController)和OData v4,其中有一个获取操作将ODataQueryOptions作为参数,如下所示:

public Product[] Get(ODataQueryOptions<Product> queryOptions){
    // Do query ...
}

当我通过web api调用将oData查询请求作为uri发送给ApiController时,ODataQueryOptions会自动填充。然而,当查询字符串非常长时,我会遇到异常。我认为这些异常是由于uri的长度超过限制所导致的。我考虑通过请求体传递oData查询字符串,而不是直接通过uri传递,希望绕过uri长度限制问题。例如,
public Product[] Get([FromBody] uriString){
    // var oDataQueryOptions = SomeMethod(uriString);
    // Do query ...
}

似乎可以使用ODataQueryContext和HttpRequestMessage构建ODataQueryOptions:
public ODataQueryOptions(
    ODataQueryContext context,
    HttpRequestMessage request
)

ODataQueryContext可以使用以下方法构建:
public ODataQueryContext(
    IEdmModel model,
    Type elementClrType,
    ODataPath path
)

我能够获取模型(IEdmModel)和元素ClrType(Type)。然而,我不知道如何从查询 URI 中获取 ODataPath。

此外,我可以使用 URI 字符串构造 HttpRequestMessage(可能非常长的字符串)吗?

同样地,我正在使用带有 OData V4 的普通 ApiController。

任何帮助将不胜感激!

1个回答

1
  1. 关于生成ODataPath,您可以使用ODataPath DefaultODataPathHandler.Parse(IEdmModel model, string serviceRoot, string odataPath)。其中odataPath是经过url转义的服务根路径和查询选项部分。

  2. HttpRequestMessage的构造函数非常简单,例如:new HttpRequestMessage(HttpMethod.Get, "http://example.com")

但我不确定您是否可以通过这种方式绕过查询URL长度限制。我认为WebAPI OData实际上正在尝试与您尝试的相同的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接