Uruchomiłem to w trybie debugowania i dołączam obraz ze szczegółami wyjątku. Skąd mogę wiedzieć, co poszło nie tak? Próbowałem wstawić dane do tabeli. Czy lazur nie może podać mi więcej szczegółów?
Obs: Magazyn znajduje się w systemie Windows Azure, a nie na moim komputerze. Tabele zostały utworzone, ale podczas wstawiania danych pojawia się ten błąd
// 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();
a oto kod wstawiania:
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);
}
}
Odpowiedzi:
Błąd 400 oznacza, że coś jest nie tak z wartością jednej z twoich właściwości. Jednym ze sposobów, aby się tego dowiedzieć, jest prześledzenie żądania / odpowiedzi za pomocą programu Fiddler i sprawdzenie rzeczywistych danych wysyłanych do magazynu Windows Azure.
Przyjmując dzikie przypuszczenie, zakładam, rzucając okiem na twój kod, że w modelu masz pewne właściwości typu Data / Czas (OfflineTimestamp, OnlineTimestamp) i zauważyłem, że w niektórych scenariuszach jeden z nich jest inicjowany z wartością domyślną, która to „ DateTime.MinValue ”. Należy pamiętać, że minimalna dozwolona wartość atrybutu typu Data / godzina to 1 stycznia 1601 (UTC) w systemie Windows Azure [http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx] . Sprawdź, czy tak nie jest. W takim przypadku możesz uczynić je polami typu nullable, aby nie były wypełniane wartościami domyślnymi.
Spójrz na odpowiedź Juha Palomäkiego również poniżej ... czasami jest nieco bardziej przydatna wiadomość w wyjątku, w którym sugeruje (RequestInformation.ExtendedErrorInformation.ErrorMessage)
źródło
StorageException zawiera również nieco bardziej szczegółowe informacje o błędzie.
Sprawdź debuger: StorageException.RequestInformation.ExtendedInformation
źródło
The specifed resource name contains invalid characters.
nazwa mojego stołu miała w sobie myślniki ... tak jak nazwy moich kolejek ... westchnij. Miejmy nadzieję, że wyszukiwanie znajdzie to dla większej liczby osób! zobacz: stackoverflow.com/questions/45305556/…W moim przypadku był to ukośnik RowKey .
Otrzymałem również komunikat „OutOfRangeInput - Jedno z danych wejściowych żądania jest poza zakresem”. błąd podczas próby ręcznego dodania za pomocą emulatora magazynu.
http://msdn.microsoft.com/en-us/library/dd179338.aspx
Napisałem metodę rozszerzenia, aby sobie z tym poradzić.
źródło
Napotkałem ten sam problem, ale przyczyną w moim przypadku był rozmiar. Po zagłębieniu się w dodatkowe właściwości wyjątku (RequestInformation.ExtendedErrorInformation) znalazłem przyczynę:
ErrorCode: PropertyValueTooLarge ErrorMessage: Wartość właściwości przekracza maksymalny dozwolony rozmiar (64 KB). Jeśli wartość właściwości jest ciągiem, jest zakodowana w formacie UTF-16, a maksymalna liczba znaków nie może przekraczać 32 KB.
źródło
cóż, w moim przypadku próbowałem to zrobić:
z powodu ContainerName
SessionMaterials
(co jest nawykiem pisania w Pascal Case i Camel Case: D) powodowało to 400 złych żądań. Więc po prostu muszę to zrobićsessionmaterials
. i zadziałało.Mam nadzieję, że to komuś pomoże.
PS: - Po prostu sprawdź odpowiedź http wyjątku lub użyj fiddlera do przechwycenia żądania i odpowiedzi.
źródło
w moim przypadku: nazwa kontenera była zapisana wielką literą. istnieją ograniczenia podczas używania znaków.
źródło
Czasami to dlatego, że jesteś
partitionKey
lubrowKey
jestNULL
(tak było w moim przypadku)
źródło
Dokumentację firmy MS dotyczącą wszystkich kodów błędów obsługi tabel można znaleźć tutaj
źródło
Miałem ten sam błąd BadRequest (400), na koniec wypełniam ręcznie:
I pracował dla mnie. Mam nadzieję że to pomoże!
źródło
Timestamp
trzeba to wygenerować ręcznie. To jest naprawdę denerwujące.Miałem też podobny problem. W moim przypadku wartość PartitionKey nie została ustawiona, więc domyślnie PartitionKey ma wartość null, co spowodowało
Object reference not set to an instance of an object.
wyjątekSprawdź, czy podajesz odpowiednie wartości dla PartitionKey lub RowKey, możesz napotkać taki problem.
źródło
Naprawiłem moje przypadki i działało dobrze
Moje sprawy:
źródło
Otrzymałem 400 złych żądań, ponieważ korzystałem z ZRS (Zone Redundant Storage), a Analytics nie jest dostępny dla tego typu magazynu. Nie wiedziałem, że korzystam z Analytics.
Usunąłem kontener do przechowywania i odtworzyłem jako GRS, a teraz działa dobrze.
źródło
Otrzymałem (400) Bad Request, StatusMessage: Bad Request, ErrorCode: OutOfRangeInput, gdy jednostka miała ustawioną właściwość DateTime (= DateTime.MinValue)
źródło
W moim przypadku: dołączyłem metadane obiektu BLOB z nazwą tagu zawierającą łącznik.
"added-by"
Problemem była myślnik , a później RTFM powiedział mi, że nazwy tagów muszą być zgodne z konwencjami identyfikatorów C #.Ref: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata
Podkreślenie działa dobrze.
źródło
W moim przypadku nie powinienem dodawać PartitionKey i Rowkey do mojej klasy encji. Powinien pochodzić z klasy bazowej. Poniżej po prostu zadziała.
źródło
Jeśli używasz NodeJS i natknąłeś się na ten post, tylko po to, aby odkryć, że nie masz tak pięknych szczegółowych informacji w swoim obiekcie błędu; możesz użyć proxy, aby uzyskać te szczegóły. Ponieważ jednak nikt tutaj nie wspomina JAK używać proxy.
Najprostszym sposobem korzystania z NodeJS jest ustawienie dwóch zmiennych środowiskowych:
Jeśli faktycznie używasz C #, tak jak robi to autor tego postu; możesz po prostu zainstalować Fiddlera i ustawić go na przechwytywanie. Domyślnie powinien przechwytywać żądania. Może być konieczne zaufanie do certyfikatu Fiddlera lub w inny sposób wykonanie odpowiednika „NODE_TLS_REJECT_UNAUTHORIZED = 0” węzła.
źródło
Otrzymałem odpowiedź 400-BadRequest z interfejsu API tabeli kont magazynu Azure. Informacje o wyjątku wskazują, że „Konto, do którego uzyskiwany jest dostęp, nie obsługuje protokołu http.”. Pomyślałem, że musimy używać protokołu HTTPS w parametrach połączenia, gdy w konfiguracji konta magazynu jest włączona opcja „Wymagany bezpieczny transfer”, jak pokazano na poniższym obrazku.
źródło
W moim przypadku do stworzenia nowej instalacji klasy "TableBotDataStore" (framework bota MS) przekazujemy parametr "tableName" z myślnikiem typu "master-bot" a TableBotDataStore może mieć nazwy tabel zawierające tylko litery i cyfry
źródło
Miałem ten sam problem, funkcja przekazywała
containerNameKey
ciąg as. poniżej znajduje się kod, który spowodował błądZmieniłem to na
Zadziałało
źródło