在 .NET SDK 中转换会话令牌格式
适用范围: NoSQL
本文介绍如何在不同会话令牌格式之间进行转换,以确保 SDK 版本之间的兼容性。
备注
默认情况下,SDK 会自动跟踪会话令牌,并会使用最新的会话令牌。 有关详细信息,请访问利用会话令牌。 本文中的说明仅适用于以下情况:
- Azure Cosmos DB 帐户使用会话一致性。
- 你以手动方式管理会话令牌。
- 你同时使用了多个版本的 SDK。
有两种会话令牌格式:“简单”和“向量”。 这两种格式不能互换,因此,在将会话令牌传递到不同版本的客户端应用程序时,应转换格式。
- .NET SDK V1(Microsoft.Azure.DocumentDB - 版本 1.x)使用“简单”会话令牌格式。
- .NET SDK V2(Microsoft.Azure.DocumentDB - 版本 2.x)使用“向量”会话令牌格式。
简单会话令牌采用此格式:{pkrangeid}:{globalLSN}
向量会话令牌采用以下格式:{pkrangeid}:{Version}#{GlobalLSN}#{RegionId1}={LocalLsn1}#{RegionId2}={LocalLsn2}....#{RegionIdN}={LocalLsnN}
若要使用 .NET SDK V1 将会话令牌传递给客户端,请使用“简单”会话令牌格式。 例如,使用下面的示例代码来转换会话令牌。
private static readonly char[] SegmentSeparator = (new[] { '#' });
private static readonly char[] PkRangeSeparator = (new[] { ':' });
// sessionTokenToConvert = session token from previous response
string[] items = sessionTokenToConvert.Split(PkRangeSeparator, StringSplitOptions.RemoveEmptyEntries);
string[] sessionTokenSegments = items[1].Split(SessionTokenHelpers.SegmentSeparator, StringSplitOptions.RemoveEmptyEntries);
string sessionTokenInSimpleFormat;
if (sessionTokenSegments.Length == 1)
{
// returning the same token since it already has the correct format
sessionTokenInSimpleFormat = sessionTokenToConvert;
}
else
{
long version = 0;
long globalLSN = 0;
if (!long.TryParse(sessionTokenSegments[0], out version)
|| !long.TryParse(sessionTokenSegments[1], out globalLSN))
{
throw new ArgumentException("Invalid session token format", sessionTokenToConvert);
}
sessionTokenInSimpleFormat = string.Format("{0}:{1}", items[0], globalLSN);
}
若要使用 .NET SDK V2 将会话令牌传递给客户端,请使用“向量”会话令牌格式。 例如,使用下面的示例代码来转换会话令牌。
private static readonly char[] SegmentSeparator = (new[] { '#' });
private static readonly char[] PkRangeSeparator = (new[] { ':' });
// sessionTokenToConvert = session token from previous response
string[] items = sessionTokenToConvert.Split(PkRangeSeparator, StringSplitOptions.RemoveEmptyEntries);
string[] sessionTokenSegments = items[1].Split(SegmentSeparator, StringSplitOptions.RemoveEmptyEntries);
string sessionTokenInVectorFormat;
if (sessionTokenSegments.Length == 1)
{
long globalLSN = 0;
if (long.TryParse(sessionTokenSegments[0], out globalLSN))
{
sessionTokenInVectorFormat = string.Format("{0}:-2#{1}", items[0], globalLSN);
}
else
{
throw new ArgumentException("Invalid session token format", sessionTokenToConvert);
}
}
else
{
// returning the same token since it already has the correct format
sessionTokenInVectorFormat = sessionTokenToConvert;
}
请阅读以下文章: