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

时间:2015-09-15 18:26:36

标签: asp.net odata asp.net-web-api

我正在使用OData v4的ApiController(不是ODataController),其中有一个Get动作,将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)和elementClrType(Type)。但是,我不知道如何从查询uri获取ODataPath。

另外,我可以使用uri字符串构建一个HttpRequestMessage(可能很长)吗?

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

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

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

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

  3. 但我不确定你是否可以通过这种方式绕过查询网址长度限制。我认为WebAPI OData实际上与你想做的事情做同样的事情。