诊断并排查 Azure Cosmos DB SDK for .NET 中的“请求头过大”或“错误请求”消息
适用范围: NoSQL
引发了“请求标头太大”消息,并显示 HTTP 错误代码 400。 如果请求标头的大小变得太大以致超过了允许的最大值,则会发生此错误。 建议使用最新版本的 Azure Cosmos DB SDK for .NET。 建议使用版本 3.x,因为此主版本会向该异常消息添加请求头大小跟踪。
如果会话令牌或延续令牌太大,则会出现“请求标头太大”消息。 以下各部分介绍了每个类别中的问题原因及其解决方案。
本部分介绍了会话令牌过大的情况。
由于会话令牌太大,可能会出现 400 错误请求。 如果以下表述为真,则会话令牌太大:
- 此错误发生在其中没有延续令牌的点操作(例如创建、读取、更新等)上。
- 异常启动时没有对应用程序进行任何更改。 会话令牌随着容器中分区数量的增加而增加。 分区数量随着数据量的增加或吞吐量的增加而增加。
重启你的客户端应用程序以重置所有会话标记。 最终,会话令牌将恢复为导致该问题的先前大小。 若要完全避免此问题,请使用下一部分中的解决方案。
- 请按照 .NET v3 或 .NET v2 性能提示文章中的指南进行操作。 将应用程序转换为使用具有传输控制协议 (TCP) 的直接连接模式。 采用 TCP 协议的直接连接模式对标头大小没有限制(HTTP 协议则有限制),因此可以避免此问题。 请确保使用最新版本的 SDK,此版本针对不可使用服务互操作时进行的查询操作提供了修复。
- 如果采用 TCP 协议的直接连接模式不是适用于你的工作负载的选项,请通过更改客户端一致性级别来缓解此情况。 会话标记仅用于实现会话一致性(这是 Azure Cosmos DB 的默认一致性级别)。 其他一致性级别不使用会话令牌。
本部分介绍了延续令牌过大的情况。
400 错误请求发生在因令牌增长过大而使用延续令牌的查询操作上。 如果不同的查询具有不同的延续令牌大小,也可能发生此错误。