本文介绍如何在不同会话令牌格式之间进行转换,以确保 SDK 版本之间的兼容性。
注释
默认情况下,SDK 会自动跟踪会话令牌,并使用最新的会话令牌。 有关详细信息,请访问 利用会话令牌。 本文中的说明仅适用于以下条件:
- Azure Cosmos DB 帐户使用会话一致性。
- 你正在手动管理会话令牌。
- 同时使用多个版本的 SDK。
会话令牌格式
有两种会话令牌格式: 简单 和 矢量。 这两种格式不可互换,因此,在传递给具有不同版本的客户端应用程序时,应转换格式。
- .NET SDK V1 使用 简单的 会话令牌格式(Microsoft.Azure.DocumentDB -version 1.x)
- .NET SDK V2 使用 矢量 会话令牌格式(Microsoft.Azure.DocumentDB -version 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;
}
后续步骤
阅读以下文章: