我正在使用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。
任何帮助将不胜感激!
答案 0 :(得分:1)
关于生成ODataPath,您可以使用ODataPath DefaultODataPathHandler.Parse(IEdmModel model, string serviceRoot, string odataPath)
。 odatapath是url转义的服务根和查询选项部分。
HttpRequestMessage的构造函数非常简单,例如:new HttpRequestMessage(HttpMethod.Get, "http://example.com")
。
但我不确定你是否可以通过这种方式绕过查询网址长度限制。我认为WebAPI OData实际上与你想做的事情做同样的事情。