在 .NET SDK 中转换会话令牌格式

本文介绍如何在不同会话令牌格式之间进行转换,以确保 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;
}

后续步骤

阅读以下文章: