Saya menjalankan ini dalam mode debug, dan saya melampirkan gambar dengan detail pengecualian. Bagaimana saya bisa tahu apa yang salah? Saya mencoba memasukkan data ke dalam tabel. Tidak bisakah biru memberi saya detail lebih lanjut?
Obs: Penyimpanan ada di Windows Azure bukan di komputer saya. Tabel dibuat, tetapi saya mendapatkan kesalahan ini saat memasukkan data
// Retrieve the storage account from the connection string.
Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=***;AccountKey=***");
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
// Create the table if it doesn't exist.
CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory");
table.CreateIfNotExists();
dan ini kode sisipannya:
public static void SetStatus(Employee e, bool value)
{
try
{
// Retrieve the storage account from the connection string.
Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=###;AccountKey=###");
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
// Create the CloudTable object that represents the "people" table.
CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory");
// Create a new customer entity.
if (value == true)
{
EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id);
empHistory.IsOnline = true;
empHistory.OnlineTimestamp = DateTime.Now;
TableOperation insertOperation = TableOperation.Insert(empHistory);
table.Execute(insertOperation);
}
else
{
TableQuery<EmployeeOnlineHistory> query = new TableQuery<EmployeeOnlineHistory>()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, e.Id.ToString()));
EmployeeOnlineHistory entity = table.ExecuteQuery(query).Take(1).FirstOrDefault();
if ((entity!=null)&&(entity.IsOnline))
{
entity.IsOnline = false;
entity.OfflineTimestamp = DateTime.Now;
entity.OnlineTime = (entity.OfflineTimestamp - entity.OnlineTimestamp);
TableOperation updateOperation = TableOperation.Replace(entity);
table.Execute(updateOperation);
}
else
{
EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id);
empHistory.IsOnline = false;
empHistory.OfflineTimestamp = DateTime.Now;
TableOperation insertOperation = TableOperation.Insert(empHistory);
table.Execute(insertOperation);
}
}
}
catch (Exception ex)
{
//var details = new System.IO.StreamReader(((Microsoft.WindowsAzure.Storage.StorageException)ex)..Response.GetResponseStream()).ReadToEnd();
LogFile.Error("EmployeeOnlineHistory.setStatus",ex);
}
}
Jawaban:
400 Error berarti ada yang salah dengan nilai salah satu properti Anda. Salah satu cara untuk mengetahuinya adalah dengan melacak permintaan / respons melalui Fiddler dan melihat data aktual yang dikirim ke Windows Azure Storage.
Mengambil tebakan liar, saya berasumsi dengan melihat sekilas kode Anda bahwa dalam model Anda, Anda memiliki beberapa properti tipe Tanggal / Waktu (OfflineTimestamp, OnlineTimestamp) dan mengamati bahwa dalam skenario tertentu salah satunya diinisialisasi dengan nilai default yang adalah " DateTime.MinValue ". Harap dicatat bahwa nilai minimum yang diperbolehkan untuk atribut tipe Tanggal / Waktu adalah 1 Jan 1601 (UTC) di Windows Azure [http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx] . Silakan lihat apakah bukan itu masalahnya. Jika demikian, maka Anda bisa menjadikannya bidang tipe nullable sehingga tidak diisi dengan nilai default.
Lihatlah jawaban Juha Palomäki di bawah ini juga ... terkadang ada pesan yang sedikit lebih berguna dalam pengecualian yang dia sarankan (RequestInformation.ExtendedErrorInformation.ErrorMessage)
sumber
StorageException juga berisi informasi yang sedikit lebih detail tentang kesalahan.
Periksa di debugger: StorageException.RequestInformation.ExtendedInformation
sumber
The specifed resource name contains invalid characters.
nama meja saya memiliki tanda hubung di dalamnya ... seperti nama antrian saya ... huh. Semoga pencarian mengambil ini untuk lebih banyak orang! lihat: stackoverflow.com/questions/45305556/…Dalam kasus saya, itu adalah garis miring di RowKey .
Saya juga menerima 'OutOfRangeInput - Salah satu input permintaan di luar jangkauan.' error saat mencoba menambahkan secara manual melalui emulator penyimpanan.
http://msdn.microsoft.com/en-us/library/dd179338.aspx
Saya menulis metode ekstensi untuk menangani ini untuk saya.
sumber
Saya menghadapi masalah yang sama tetapi alasan dalam kasus saya adalah karena ukuran. Setelah menggali properti pengecualian tambahan (RequestInformation.ExtendedErrorInformation), temukan alasannya:
ErrorCode: PropertyValueTooLarge ErrorMessage: Nilai properti melebihi ukuran maksimum yang diperbolehkan (64KB). Jika nilai properti adalah string, itu adalah UTF-16 dan jumlah karakter maksimum harus 32K atau kurang.
sumber
baik, dalam kasus saya, saya mencoba melakukan ini:
karena ContainerName
SessionMaterials
(sebagai kebiasaan menulis di Pascal Case dan Camel Case: D) menyebabkan 400 permintaan yang buruk. Jadi, saya harus membuatnyasessionmaterials
. dan itu berhasil.Semoga ini bisa membantu seseorang.
PS: - Cukup periksa respons http pengecualian atau gunakan fiddler untuk menangkap permintaan dan respons.
sumber
dalam kasus saya: Nama wadah ditulis dengan huruf kapital. ada batasan saat menggunakan karakter.
sumber
Kadang-kadang itu karena Anda
partitionKey
ataurowKey
adalahNULL
(itu kasus saya)
sumber
Dokumentasi dari MS tentang semua Kode Kesalahan Layanan Tabel dapat ditemukan di sini
sumber
Saya mengalami Error BadRequest (400) yang sama, pada akhirnya saya isi secara manual:
Dan bekerja untuk saya. Semoga ini membantu!
sumber
Timestamp
harus dibuat secara manual. Sangat menyebalkan.Saya juga menghadapi masalah yang sama. Dalam kasus saya, nilai PartitionKey tidak disetel, jadi secara default nilai PartitionKey adalah null, yang mengakibatkan
Object reference not set to an instance of an object.
pengecualianPeriksa apakah Anda memberikan nilai yang sesuai untuk PartitionKey atau RowKey, Anda mungkin menghadapi masalah seperti itu.
sumber
Saya memperbaiki kasus saya dan bekerja dengan baik
Kasus saya:
sumber
Saya mendapatkan 400 Permintaan Buruk karena saya menggunakan ZRS (Zone Redundant Storage), dan Analytics tidak tersedia untuk jenis penyimpanan ini. Saya tidak sadar saya menggunakan Analytics.
Saya menghapus wadah penyimpanan dan membuatnya kembali sebagai GRS dan sekarang berfungsi dengan baik.
sumber
Saya mendapatkan (400) Permintaan Buruk, StatusMessage: Permintaan Buruk, ErrorCode: OutOfRangeInput ketika entitas memiliki properti DateTime tidak disetel (= DateTime.MinValue)
sumber
Dalam kasus saya: Saya menyertakan metadata blob dengan nama tag yang berisi tanda hubung.
Tanda hubung di
"added-by"
masalahnya, dan kemudian RTFM memberi tahu saya bahwa nama tag harus sesuai dengan konvensi pengenal C #.Ref: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata
Garis bawah berfungsi dengan baik.
sumber
Dalam kasus saya, saya tidak boleh menambahkan PartitionKey dan Rowkey di kelas entitas saya. Itu harus dari kelas dasar. Di bawah ini akan berhasil.
sumber
Jika Anda menggunakan NodeJS dan menemukan posting ini, hanya untuk menemukan bahwa Anda tidak mendapatkan informasi rinci yang indah di objek kesalahan Anda; Anda dapat menggunakan proxy untuk mendapatkan detail tersebut. Namun, karena tidak ada orang di sini yang menyebutkan CARA menggunakan proxy.
Cara termudah dengan NodeJS adalah dengan menetapkan dua variabel lingkungan:
Jika Anda benar-benar menggunakan C #, seperti yang dilakukan penulis posting ini; Anda cukup menginstal Fiddler dan mengaturnya ke intercept. Secara default itu harus mencegat permintaan. Anda mungkin juga perlu mempercayai sertifikat Fiddler atau melakukan hal yang setara dengan "NODE_TLS_REJECT_UNAUTHORIZED = 0" Node.
sumber
Saya mendapat respons 400-BadRequest dari Azure Storage Account Table API. Informasi pengecualian menunjukkan bahwa "Akun yang diakses tidak mendukung http.". Saya pikir kita harus menggunakan https dalam string koneksi ketika "Secure transfer required" diaktifkan dalam konfigurasi akun penyimpanan seperti yang ditunjukkan pada gambar di bawah ini.
sumber
Dalam kasus saya untuk membuat instalnce baru dari kelas "TableBotDataStore" (kerangka bot MS) kami melewati parameter "tableName" dengan tanda hubung seperti "master-bot" dan TableBotDataStore hanya dapat memiliki nama tabel dengan huruf dan angka saja
sumber
Saya memiliki masalah yang sama, fungsinya meneruskan
containerNameKey
string as. di bawah ini adalah kode yang memberikan kesalahanSaya mengubahnya menjadi
Berhasil
sumber