DataServiceVersion冲突:DataServiceVersion';1.0';太低,无法满足请

本文关键字:DataServiceVersion 无法满足 太低 冲突 | 更新日期: 2023-09-27 18:24:58

使用此技术(如何在C#中针对Odata Source向LINQ查询动态添加筛选器),我在LINQ查询中动态构建了一个where子句到我的Odata端点。我经常这样做,效果很好。然而,现在我的查询包含一些odatav3.0功能,我收到了这个错误。

DataServiceVersion"1.0"对于请求来说太低。支持的最低版本是"3.0"

我已经使用上唯一的northwind端点构建了一个简单的复制,并且可以在标准C#代码或linqpad中复制它。

北风终点:http://services.odata.org/Northwind/Northwind.svc/

有效的查询。

from x in Categories
where x.Products.Any( e => e.ProductName == "chai")
select x

查询生成的URL。

http://services.odata.org/Northwind/Northwind.svc/Categories()?$filter=Products/any(e:e/ProductName eq 'chai')

这是一个查询,如果我动态地生成了where子句(就像我在上面链接的技术中所做的那样)

 from x in Categories.AddQueryOption("$filter",  "Products/any(e:e/ProductName eq 'chai')")
 select x

然而,现在我得到了错误。

当我查看我的DataServiceContext时,它有一个MaxProtocolVersion,上面写着V3,当然我的项目是dotnet4.5,纯查询正在工作。

所以我认为正在发生的事情。。是服务器支持V3功能,我正在使用它,但客户端必须查看LINQ查询,并将其DataServiceVersion标识为查询中使用的功能的最低公分母,因为我正在使用V3功能,但仅在它无法推理的动态部分,它认为我只在使用V1功能。。

如果我在选择中使用V2功能(投影),如下所示

from x in Categories.AddQueryOption("$filter",  "Products/any(e:e/ProductName eq 'chai')")
 select new { x.CategoryID, x.CategoryName }

然后我得到一个略有不同的错误

DataServiceVersion"2.0"对于请求来说太低。支持的最低版本是"3.0"。有关详细信息,请参阅下面的异常

这似乎支持了我的假设。。

所以我可以看到两个解决方案1) 告诉DataServiceContext或引擎强制客户端将查询标识为V3的某种方式,或者像上面一样,我在查询的选择中使用了V2功能,从而提出了引擎可以从它可以识别的查询部分中计算出的"最低公分母",所以我也可以在select中使用一些V3功能,或者另一个子句只是为了强制查询实际为V3?

有人知道什么能帮上忙的吗?

DataServiceVersion冲突:DataServiceVersion';1.0';太低,无法满足请

这就是我发现有效的方法。基本上,我只是挂接并覆盖HTTP标头

MyDatacontext.SendingRequest2 += (sender, eventArgs) => {                 
           eventArgs.RequestMessage.SetHeader("DataServiceVersion", "3.0;NetFx");
    };

我使用的是WCF 5.0,所以使用的是SendingRequest2,但如果使用的是旧版本,则可能会使用折旧后的SendingRequest或BuildingRequest事件。

相关文章:
  • 没有找到相关文章