你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

诊断并排查 Azure Cosmos DB SDK for .NET 中的“请求头过大”或“错误请求”消息

适用范围: NoSQL

引发了“请求标头太大”消息,并显示 HTTP 错误代码 400。 如果请求标头的大小变得太大以致超过了允许的最大值,则会发生此错误。 建议使用最新版本的 Azure Cosmos DB SDK for .NET。 建议使用版本 3.x,因为此主版本会向该异常消息添加请求头大小跟踪。

疑难解答步骤

如果会话令牌或延续令牌太大,则会出现“请求标头太大”消息。 以下各部分介绍了每个类别中的问题原因及其解决方案。

会话令牌太大

本部分介绍了会话令牌过大的情况。

原因

由于会话令牌太大,可能会出现 400 错误请求。 如果以下表述为真,则会话令牌太大:

  • 此错误发生在其中没有延续令牌的点操作(例如创建、读取、更新等)上。
  • 异常启动时没有对应用程序进行任何更改。 会话令牌随着容器中分区数量的增加而增加。 分区数量随着数据量的增加或吞吐量的增加而增加。

临时缓解措施

重启你的客户端应用程序以重置所有会话标记。 最终,会话令牌将恢复为导致该问题的先前大小。 若要完全避免此问题,请使用下一部分中的解决方案。

解决方案

重要

至少升级到 .NET v3.20.1v2.16.1。 这些次要版本中包含用于减小会话令牌大小,以防止标头增长并达到大小限制的诸多优化。

  1. 请按照 .NET v3.NET v2 性能提示文章中的指南进行操作。 将应用程序转换为使用具有传输控制协议 (TCP) 的直接连接模式。 采用 TCP 协议的直接连接模式对标头大小没有限制(HTTP 协议则有限制),因此可以避免此问题。 请确保使用最新版本的 SDK,此版本针对不可使用服务互操作时进行的查询操作提供了修复。
  2. 如果采用 TCP 协议的直接连接模式不是适用于你的工作负载的选项,请通过更改客户端一致性级别来缓解此情况。 会话标记仅用于实现会话一致性(这是 Azure Cosmos DB 的默认一致性级别)。 其他一致性级别不使用会话令牌。

延续令牌太大

本部分介绍了延续令牌过大的情况。

原因

400 错误请求发生在因令牌增长过大而使用延续令牌的查询操作上。 如果不同的查询具有不同的延续令牌大小,也可能发生此错误。

解决方案

  1. 请按照 .NET v3.NET v2 性能提示文章中的指南进行操作。 将应用程序转换为使用具有 TCP 协议的直接连接模式。 采用 TCP 协议的直接连接模式对标头大小没有限制(HTTP 协议则有限制),因此可以避免此问题。
  2. 如果采用 TCP 协议的直接连接模式不是适用于你的工作负载的选项,请设置 ResponseContinuationTokenLimitInKb 选项。 可以在 v2 的 FeedOptions 或 v3 的 QueryRequestOptions 中找到此选项。

后续步骤