【问题标题】:Interesting Issue found when using WCF Data Service Client Library to query data from a WCF Data Service使用 WCF 数据服务客户端库从 WCF 数据服务查询数据时发现的有趣问题
【发布时间】:2012-09-12 11:38:24
【问题描述】:

我有一个简单的数据模型,其中包含 3 个表(帐户、联系人和用户),它们具有以下关系:

用户 -> 帐户(1 - 许多)帐户 -> 联系人(许多 - 1)

我通过 OData (v3) WCF 数据服务公开我的数据,该服务由使用 WCF 数据服务客户端库的 .NET 客户端使用。我使用添加服务实用程序生成客户端代理代码来调用数据服务。

客户端类中的所有方法都使用该类的单个 DataServiceContext 对象来调用 Web 服务。即:

DC.WhEntities svcClient = new DC.WhEntities(new Uri(BaseUrl));

我很难弄清楚为什么对服务的相同查询请求在第 6 次之后开始失败。我已经尝试了所有可能的方法来构造对数据服务的调用:

第一种方法:

DataServiceQuery<DC.User> users = svcClient.Users.Expand("Accounts");
QueryOperationResponse<DC.User> response = users.Execute() as QueryOperationResponse<DC.User>;
var user = response.FirstOrDefault(u => u.Id == long.Parse(key.ToString()));

第二种方法:

string queryString = string.Format("Users({0}L)?$expand=Accounts", key.ToString());
foreach (var user in response) {...}

上述两个解决方案中的最后一条语句在连续成功执行 6 次后开始失败并显示以下消息:

The response payload is a not a valid response payload. Please make sure that the top level element is a valid Atom element or belongs to 'http://schemas.microsoft.com/ado/2007/08/dataservices' namespace.

**StackTrace:**
   at System.Data.Services.Client.Materialization.ODataMaterializer.CreateODataMessageReader(IODataResponseMessage responseMessage, ResponseInfo responseInfo, Boolean projectionQuery, ODataPayloadKind& payloadKind)
   at System.Data.Services.Client.Materialization.ODataMaterializer.CreateMaterializerForMessage(IODataResponseMessage responseMessage, ResponseInfo responseInfo, Type materializerType, QueryComponents queryComponents, ProjectionPlan plan, ODataPayloadKind payloadKind)
   at System.Data.Services.Client.DataServiceRequest.Materialize(ResponseInfo responseInfo, QueryComponents queryComponents, ProjectionPlan plan, String contentType, IODataResponseMessage message, ODataPayloadKind expectedPayloadKind)
   at System.Data.Services.Client.QueryResult.ProcessResult[TElement](ProjectionPlan plan)
   at System.Data.Services.Client.DataServiceRequest.Execute[TElement](DataServiceContext context, QueryComponents queryComponents)

当这种情况发生时,我的 WCF 数据服务刚刚停止工作并返回一个带有

的响应

第 1 行第 83 列的错误:属性值中不允许未转义的“

我不确定我是否遗漏了任何基本内容,或者我是否错误地构建了 WCF 数据服务客户端请求,或者 WCF 数据服务端是否存在不喜欢同一个客户端请求更多相同内容的内容超过 6 次。

我已经花了几天时间,我的意思是 3 天以上的时间来解决这个问题。我是 WCF 数据服务的新手,我认为我可以从本教程中学习,但到目前为止,我得到的却是痛苦多于收获。

【问题讨论】:

  • 请使用一些 HTTP 跟踪工具(如 Fiddler)来获取失败的响应并在此处与我们分享。
  • {"Message":"发生错误。","ExceptionMessage":"响应负载不是有效响应负载。请确保顶级元素是有效的 Atom 元素或属于 'schemas.microsoft.com/ado/2007/08/dataservices' 命名空间。","ExceptionType":"System.InvalidOperationException","StackTrace":" at System.Data.Services.Client.Materialization.ODataMaterializer.CreateODataMessageReader(IODataResponseMessage responseMessage, ResponseInfo responseInfo, Boolean projectionQuery , ODataPayloadKind&payloadKind)\r\n
  • 在 System.Data.Services.Client.Materialization.ODataMaterializer.CreateMaterializerForMessage(IODataResponseMessage responseMessage, ResponseInfo responseInfo, Type materializerType, QueryComponents queryComponents, ProjectionPlan plan, ODataPayloadKind payloadKind)\r\n 在 System.Data。 Services.Client.DataServiceRequest.Materialize(ResponseInfo responseInfo, QueryComponents queryComponents, ProjectionPlan plan, String contentType, IODataResponseMessage message, ODataPayloadKind expectedPayloadKind)\r\n
  • 在 System.Data.Services.Client.QueryResult.ProcessResult[TElement](ProjectionPlan 计划)\r\n 在 System.Data.Services.Client.DataServiceRequest.Execute[TElement](DataServiceContext 上下文, QueryComponents queryComponents)"}
  • 非常感谢您看到这个,Vitek!

标签: c# .net wcf exception-handling wcf-data-services


【解决方案1】:

我遇到了类似的问题,突然我的服务器启动(可能是一些更新造成了这种情况,但原因未知)返回错误的响应。如果我启动我的服务器它可以工作一段时间,假设以正常方式响应几个请求,然后开始破坏 OData 提要的 xml 结构,导致&lt;,十六进制值0x3C,是一个无效的属性字符. Line 2, position 72. exception

解决方案:

我通过关注this feed解决了这个问题

如果您配置了 WCF 跟踪,请确保 logMessagesAtTransportLevel="false" 已关闭,否则您将遇到此问题。

【讨论】:

    【解决方案2】:

    我尝试将 logMessagesAtTransportLevel 设置为 false,但仍然出现错误。

    然后我记得在我遇到装配冲突之前看到过这个问题。我去创建了一个全新的服务,即使我在客户端上将 logMessagesAtTransportLevel 设置为 true,这也解决了我的问题。这确保了我的问题在于服务。

    虽然我的解决方案解决了我的问题,但我仍然不知道确切的问题,而且我已经没有时间找到它了。但是,很高兴看到人们愿意提供帮助,我真的很感谢您的努力。

    再次感谢大家的帮助。

    Qster123.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      相关资源
      最近更新 更多