Ich habe dies im Debug-Modus ausgeführt und ein Bild mit den Details der Ausnahme angehängt. Wie kann ich wissen, was schief gelaufen ist? Ich habe versucht, Daten in eine Tabelle einzufügen. Kann Azure mir nicht mehr Details geben?
Hinweis: Der Speicher befindet sich unter Windows Azure und nicht auf meinem Computer. Die Tabellen wurden erstellt, aber ich erhalte diesen Fehler beim Einfügen von Daten
// 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();
und hier ist der Einfügecode:
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);
}
}
Antworten:
400 Fehler bedeutet, dass mit dem Wert einer Ihrer Eigenschaften etwas nicht stimmt. Eine Möglichkeit, dies herauszufinden, besteht darin, die Anforderung / Antwort über Fiddler zu verfolgen und die tatsächlichen Daten anzuzeigen, die an Windows Azure Storage gesendet werden.
Ich gehe davon aus, dass Sie in Ihrem Modell einige Eigenschaften vom Typ Datum / Uhrzeit (OfflineTimestamp, OnlineTimestamp) haben und festgestellt haben, dass in bestimmten Szenarien eine davon mit dem Standardwert initialisiert wird ist " DateTime.MinValue ". Beachten Sie, dass der Mindestwert für ein Attribut vom Typ Datum / Uhrzeit der 1. Januar 1601 (UTC) in Windows Azure ist [http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx]. . Bitte sehen Sie, ob dies nicht der Fall ist. Wenn dies der Fall ist, können Sie sie zu nullbaren Typfeldern machen, damit sie nicht mit den Standardwerten gefüllt werden.
Schauen Sie sich auch die Antwort von Juha Palomäki unten an ... manchmal gibt es eine etwas nützlichere Nachricht in der Ausnahme, in der er vorschlägt (RequestInformation.ExtendedErrorInformation.ErrorMessage)
quelle
Die StorageException enthält auch etwas detailliertere Informationen zu Fehlern.
Checken Sie den Debugger ein: StorageException.RequestInformation.ExtendedInformation
quelle
The specifed resource name contains invalid characters.
Mein Tabellenname hatte Bindestriche ... genau wie meine Warteschlangennamen ... seufz. Hoffentlich nimmt die Suche dies für mehr Leute auf! siehe: stackoverflow.com/questions/45305556/…In meinem Fall war es ein Schrägstrich im RowKey .
Ich habe auch einen 'OutOfRangeInput - Einer der Anforderungseingänge liegt außerhalb des Bereichs.' Fehler beim Versuch, manuell über den Speicheremulator hinzuzufügen.
http://msdn.microsoft.com/en-us/library/dd179338.aspx
Ich habe eine Erweiterungsmethode geschrieben, um dies für mich zu erledigen.
quelle
Ich hatte das gleiche Problem, aber der Grund in meinem Fall war die Größe. Nach dem Durchsuchen der zusätzlichen Ausnahmeeigenschaften (RequestInformation.ExtendedErrorInformation) wurde der Grund gefunden:
ErrorCode: PropertyValueTooLarge ErrorMessage: Der Eigenschaftswert überschreitet die maximal zulässige Größe (64 KB). Wenn der Eigenschaftswert eine Zeichenfolge ist, ist er UTF-16-codiert und die maximale Anzahl von Zeichen sollte 32 KB oder weniger betragen.
quelle
Nun, in meinem Fall habe ich versucht, dies zu tun:
Aufgrund von ContainerName
SessionMaterials
(als Gewohnheit, in Pascal Case und Camel Case: D zu schreiben) verursachte es 400 schlechte Anfragen. Also muss ich es einfach schaffensessionmaterials
. und es hat funktioniert.Hoffe das hilft jemandem.
PS: - Überprüfen Sie einfach die http-Antwort der Ausnahme oder verwenden Sie den Geiger, um die Anforderung und die Antwort zu erfassen.
quelle
in meinem Fall: Containername war in Großbuchstaben. Bei der Verwendung von Zeichen gibt es Einschränkungen.
quelle
Manchmal liegt es daran, dass du
partitionKey
oderrowKey
bistNULL
(es war der Fall für mich)
quelle
Eine Dokumentation von MS zu allen Table Service-Fehlercodes finden Sie hier
quelle
Ich hatte den gleichen BadRequest (400) Fehler, am Ende fülle ich manuell:
Und für mich gearbeitet. Hoffe das hilft!
quelle
Timestamp
manuell generiert werden muss. Es ist wirklich nervig.Ich stand auch vor dem gleichen Problem. In meinem Fall wurde der PartitionKey-Wert nicht festgelegt, daher war der PartitionKey-Wert standardmäßig null, was zu einer
Object reference not set to an instance of an object.
Ausnahme führteÜberprüfen Sie, ob Sie die entsprechenden Werte für PartitionKey oder RowKey angeben. Möglicherweise tritt ein solches Problem auf.
quelle
Ich habe meine Fälle repariert und es hat gut funktioniert
Meine Fälle:
quelle
Ich habe eine 400 Bad Request erhalten, weil ich ZRS (Zone Redundant Storage) verwendet habe und Analytics für diesen Speichertyp nicht verfügbar ist. Mir war nicht bewusst, dass ich Analytics verwende.
Ich habe den Speichercontainer gelöscht und als GRS neu erstellt und jetzt funktioniert es einwandfrei.
quelle
Ich habe eine (400) fehlerhafte Anforderung, StatusMessage: fehlerhafte Anforderung, Fehlercode: OutOfRangeInput erhalten, wenn für die Entität eine Eigenschaft DateTime nicht festgelegt wurde (= DateTime.MinValue).
quelle
In meinem Fall: Ich habe Blob-Metadaten mit einem Tag-Namen eingefügt, der einen Bindestrich enthält.
Der Strich
"added-by"
war das Problem, und später sagte mir RTFM, dass Tag-Namen den Konventionen für C # -Kennungen entsprechen müssen.Ref: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata
Unterstrich funktioniert gut.
quelle
In meinem Fall sollte ich PartitionKey und Rowkey nicht zu meiner Entitätsklasse hinzufügen. Es sollte aus der Basisklasse stammen. Unten würde einfach funktionieren.
quelle
Wenn Sie NodeJS verwenden und über diesen Beitrag gestolpert sind, stellen Sie nur fest, dass Ihr Fehlerobjekt nicht so schöne detaillierte Informationen enthält. Sie können einen Proxy verwenden, um diese Details abzurufen. Da hier jedoch niemand erwähnt, wie ein Proxy verwendet werden soll.
Der einfachste Weg mit NodeJS besteht darin, zwei Umgebungsvariablen festzulegen:
Wenn Sie tatsächlich C # verwenden, wie es der Autor dieses Beitrags tut; Sie können Fiddler einfach installieren und so einstellen, dass es abfängt. Standardmäßig sollte es die Anforderungen abfangen. Möglicherweise müssen Sie auch dem Fiddler-Zertifikat vertrauen oder auf andere Weise das Äquivalent von "NODE_TLS_REJECT_UNAUTHORIZED = 0" des Knotens ausführen.
quelle
Ich habe eine 400-BadRequest-Antwort von der Azure Storage Account Table-API erhalten. Ausnahmeinformationen zeigten, dass "Das Konto, auf das zugegriffen wird, http nicht unterstützt." Ich dachte mir, dass wir https in der Verbindungszeichenfolge verwenden müssen, wenn "Sichere Übertragung erforderlich" in der Konfiguration des Speicherkontos aktiviert ist (siehe Abbildung unten).
quelle
In meinem Fall übergeben wir zum Erstellen einer neuen Instanz der Klasse "TableBotDataStore" (MS-Bot-Framework) den Parameter "tableName" mit einem Bindestrich wie "master-bot", und TableBotDataStore kann Tabellennamen nur mit Buchstaben und Zahlen enthalten
quelle
Ich hatte das gleiche Problem, die Funktion übergab den
containerNameKey
as-String. unten ist der Code, der Fehler gabIch habe es geändert in
Es funktionierte
quelle