Ағылшын тілінде оқу

Бөлісу құралы:


Преобразование форматов маркеров сеанса в пакете SDK для .NET

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

В этой статье объясняется, как выполнять преобразование между различными форматами маркеров сеанса для обеспечения совместимости между версиями пакета SDK.

Ескерім

По умолчанию пакет SDK автоматически отслеживает маркер сеанса и использует последний по времени маркер. Дополнительные сведения см. в разделе "Использование маркеров сеанса" статьи "Управление уровнями согласованности в Azure Cosmos DB". Инструкции в этой статье применимы только при соблюдении следующих условий:

  • ваша учетная запись Azure Cosmos DB использует согласованность сеансов;
  • Вы управляете токенами сеанса вручную.
  • вы одновременно используете несколько версий пакета SDK.

Форматы маркеров сеанса

Существует два формата маркеров сеанса: простой и векторный. Так как эти форматы не взаимозаменяемы, при передаче маркера сеанса в клиентское приложение на базе другой версии пакета SDK необходимо преобразовать его формат.

  • Простой формат маркера сеанса используется пакетом SDK для .NET версии 1 (Microsoft.Azure.DocumentDB — версия 1.x).
  • Векторный формат маркера сеанса используется пакетом SDK для .NET версии 2 (Microsoft.Azure.DocumentDB — версия 2.x).

Простой маркер сеанса

Простой маркер сеанса имеет следующий формат: {pkrangeid}:{globalLSN}

Векторный маркер сеанса

Векторный маркер сеанса имеет следующий формат: {pkrangeid}:{Version}#{GlobalLSN}#{RegionId1}={LocalLsn1}#{RegionId2}={LocalLsn2}....#{RegionIdN}={LocalLsnN}

Преобразование в простой маркер сеанса

Чтобы передать маркер сеанса клиенту на базе пакета SDK для .NET версии 1, используйте простой формат маркера сеанса. Пример кода для преобразования приведен ниже.

C#
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);
}

Преобразование в векторный маркер сеанса

Чтобы передать маркер сеанса клиенту на базе пакета SDK для .NET версии 2, используйте векторный формат маркера сеанса. Пример кода для преобразования приведен ниже.

C#

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

Следующие шаги

Ознакомьтесь со следующими статьями: