在 .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;
}

后续步骤

请阅读以下文章: