Aracılığıyla paylaş


Azure Cosmos DB bulunamadı özel durumlarını tanılama ve sorunlarını giderme

UYGULANANLAR: NoSQL

HTTP durum kodu 404 kaynağın artık mevcut olmadığını gösterir.

Beklenen davranış

Bir uygulamanın 404 kodu beklediği ve senaryoyu doğru şekilde işlediği birçok geçerli senaryo vardır.

Bulunması gereken veya var olan bir öğe için bulunamadı özel durumu döndürüldü

Öğe mevcutsa veya varsa 404 durum kodunun döndürülmesi için olası nedenler aşağıdadır.

Giriş oturumu belirteci için okuma oturumu kullanılamıyor

Çözüm:

  1. Geçerli SDK'nızı kullanılabilir en son sürüme güncelleştirin. Bu hatanın en yaygın nedenleri en yeni SDK sürümlerinde düzeltilmiştir.

Yarış durumu

Birden çok SDK istemci örneği vardır ve yazmadan önce okuma gerçekleştirilir.

Çözüm:

  1. Azure Cosmos DB için varsayılan hesap tutarlılığı oturum tutarlılığıdır. Bir öğe oluşturulduğunda veya güncelleştirildiğinde yanıt, okuma isteğinin bu değişiklikle bir çoğaltmadan okuduğunu garanti etmek için SDK örnekleri arasında geçirilebilen bir oturum belirteci döndürür.
  2. Tutarlılık düzeyini daha güçlü bir düzeye değiştirin.

Kapsayıcı veya veritabanı kaynağı için okuma aktarım hızı

PowerShell veya Azure CLI kullanarak bulunamadı hata iletisi alın.

Çözüm:

Aktarım hızı veritabanı düzeyinde, kapsayıcı düzeyinde veya her ikisinde de sağlanabilir. Bulunamadı hatası alıyorsanız, üst veritabanı kaynağının veya alt kapsayıcı kaynağının aktarım hızını okumayı deneyin.

Geçersiz bölüm anahtarı ve kimlik bileşimi

Bölüm anahtarı ve kimlik bileşimi geçerli değil.

Çözüm:

Yanlış birleşime neden olan uygulama mantığını düzeltin.

Öğe kimliğinde geçersiz karakter

Azure Cosmos DB'ye öğe kimliğinde geçersiz karakter bulunan bir öğe eklenir.

Çözüm:

Kimliği, özel karakterleri içermeyen farklı bir değerle değiştirin. Kimliği değiştirmek bir seçenek değilse, Base64 özel karakterlerden kaçmak için kimliği kodlayabilirsiniz. Base64 yine de değiştirilmesi gereken geçersiz bir '/' karakterine sahip bir ad üretebilir.

Kimlik için kapsayıcıya zaten eklenmiş olan öğeler, ad tabanlı başvurular yerine RID değerleri kullanılarak değiştirilebilir.

// Get a container reference that uses RID values.
ContainerProperties containerProperties = await this.Container.ReadContainerAsync();
string[] selfLinkSegments = containerProperties.SelfLink.Split('/');
string databaseRid = selfLinkSegments[1];
string containerRid = selfLinkSegments[3];
Container containerByRid = this.cosmosClient.GetContainer(databaseRid, containerRid);

// Invalid characters are listed here.
// https://learn.microsoft.com/dotnet/api/microsoft.azure.documents.resource.id#remarks
FeedIterator<JObject> invalidItemsIterator = this.Container.GetItemQueryIterator<JObject>(
    @"select * from t where CONTAINS(t.id, ""/"") or CONTAINS(t.id, ""#"") or CONTAINS(t.id, ""?"") or CONTAINS(t.id, ""\\"") ");
while (invalidItemsIterator.HasMoreResults)
{
    foreach (JObject itemWithInvalidId in await invalidItemsIterator.ReadNextAsync())
    {
        // Choose a new ID that doesn't contain special characters.
        // If that isn't possible, then Base64 encode the ID to escape the special characters.
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(itemWithInvalidId["id"].ToString());
        itemWithInvalidId["id"] = Convert.ToBase64String(plainTextBytes).Replace('/', '!');

        // Update the item with the new ID value by using the RID-based container reference.
        JObject item = await containerByRid.ReplaceItemAsync<JObject>(
            item: itemWithInvalidId,
            ID: itemWithInvalidId["_rid"].ToString(),
            partitionKey: new Cosmos.PartitionKey(itemWithInvalidId["status"].ToString()));

        // Validating the new ID can be read by using the original name-based container reference.
        await this.Container.ReadItemAsync<ToDoActivity>(
            item["id"].ToString(),
            new Cosmos.PartitionKey(item["status"].ToString())); ;
    }
}

Yaşam Süresi temizleme

Öğenin Yaşam Süresi (TTL) özelliği ayarlanmıştı. TTL özelliğinin süresi dolduğundan öğe temizlendi.

Çözüm:

Öğenin temizlenmesini önlemek için TTL özelliğini değiştirin.

Gecikmeli dizin oluşturma

Yavaş dizin oluşturma henüz gelmedi.

Çözüm:

Dizin oluşturmanın dizin oluşturma ilkesini yakalamasını veya değiştirmesini bekleyin.

Üst kaynak silindi

Öğenin bulunduğu veritabanı veya kapsayıcı silindi.

Çözüm:

  1. Bir yedeklemeden üst kaynağı geri yükleyin veya kaynakları yeniden oluşturun.
  2. Silinen kaynağı değiştirmek için yeni bir kaynak oluşturun.

7. Kapsayıcı/Koleksiyon adları büyük/küçük harfe duyarlıdır

Kapsayıcı/Koleksiyon adları Azure Cosmos DB'de büyük/küçük harfe duyarlıdır.

Çözüm:

Azure Cosmos DB'ye bağlanırken tam adı kullandığınızdan emin olun.

Sonraki adımlar