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:
- 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:
- 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.
- 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:
- Bir yedeklemeden üst kaynağı geri yükleyin veya kaynakları yeniden oluşturun.
- 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
- Azure Cosmos DB .NET SDK'sını kullanırken sorunları tanılama ve giderme .
- .NET v3 ve .NET v2 için performans yönergeleri hakkında bilgi edinin.
- Azure Cosmos DB Java v4 SDK'sını kullanırken karşılaşılan sorunları tanılama ve giderme .
- Java v4 SDK'sı için performans yönergeleri hakkında bilgi edinin.