webentwicklung-frage-antwort-db.com.de

Azure Table Storage RowKey eingeschränkte Zeichenmuster?

Gibt es eingeschränkte Zeichenmuster in Azure TableStorage RowKeys? Ich konnte über zahlreiche Suchanfragen keine Dokumente finden. Ich bekomme jedoch ein Verhalten, das dies in einigen Leistungstests impliziert.

Ich habe ein merkwürdiges Verhalten mit RowKeys, die aus zufälligen Zeichen bestehen (der Testtreiber verhindert, dass die eingeschränkten Zeichen (/\#?) Und das Blockieren von einfachen Anführungszeichen im RowKey auftreten). Das Ergebnis ist, dass ich einen RowKey habe, der gut in die Tabelle einfügt, aber nicht abgefragt werden kann (das Ergebnis ist InvalidInput). Zum Beispiel:

RowKey: 9}5O0J=5Z,4,D,{!IKPE,~M]%54+9G0ZQ&G34!G+

Der Versuch, mit diesem RowKwy (Gleichheit) abzufragen, führt zu einem Fehler (sowohl in unserer App mit Azure Storage Explorer als auch in Cloud Storage Studio 2). Ich habe mir die Anfrage angesehen, die über Fiddler gesendet wurde:

GET /foo()?$filter=RowKey%20eq%20'9%7D5O0J=5Z,4,D,%7B!IKPE,~M%5D%54+9G0ZQ&G34!G+' HTTP/1.1

Es scheint, dass% 54 im RowKey nicht im Filter maskiert wird. Interessanterweise sehe ich ein ähnliches Verhalten für Stapelanforderungen für den Tabellenspeicher mit URIs im Stapel-XML, die diesen RowKey enthalten. Ich habe auch ein ähnliches Verhalten für RowKeys mit eingebetteten Anführungszeichen gesehen, obwohl ich dieses Muster noch nicht isoliert habe.

Hat jemand mit mir über dieses Verhalten gesprochen? Ich kann das Auftreten zusätzlicher Zeichen in RowKeys leicht einschränken, möchte aber wirklich die 'Regeln' kennen.

26
MikeN

Die folgenden Zeichen sind in den Feldern PartitionKey und RowKey nicht zulässig:

  • Der Schrägstrich (/)
  • Der umgekehrte Schrägstrich (\)
  • Das Nummernzeichen (#) 
  • Das Fragezeichen (?)

Weitere Informationen finden Sie in folgendem Artikel: http://msdn.Microsoft.com/en-us/library/windowsazure/dd179338.aspx

46
Igorek

public static readonly Regex DisallowedCharsInTableKeys = new Regex(@"[\\\\#%+/?\u0000-\u001F\u007F-\u009F]");

Erkennung ungültiger Tabellenpartition und Zeilenschlüssel: 

bool invalidKey = DisallowedCharsInTableKeys.IsMatch(tableKey);

Bereinigen des ungültigen Partitions- oder Zeilenschlüssels: 

string sanitizedKey = DisallowedCharsInTableKeys.Replace(tableKey, disallowedCharReplacement);

An dieser Stelle möchten Sie möglicherweise auch den Hash des ursprünglichen Schlüssels vor dem infizierten Schlüssel (Partitionsschlüssel oder Zeilenschlüssel) voranstellen, um falsche Kollisionen verschiedener ungültiger Schlüssel mit demselben bereinigten Wert zu vermeiden.

Verwenden Sie nicht die Zeichenfolge. GetHashCode () kann jedoch unterschiedlichen Hash-Code für dieselbe Zeichenfolge erzeugen und darf nicht zur Identifizierung von Eindeutigkeit verwendet werden und darf nicht persistiert werden.

Ich verwende SHA256: https://msdn.Microsoft.com/en-us/library/s02tk69a(v=vs.110).aspx

um den Byte-Array-Hash des ungültigen Schlüssels zu erstellen, konvertieren Sie das Byte-Array in eine hexadezimale Zeichenfolge und stellen den vorangestellten Tabellenschlüssel voran.

Siehe auch verwandte MSDN-Dokumentation: https://msdn.Microsoft.com/de-de/library/Azure/dd179338.aspx

Zugehöriger Abschnitt aus dem Link: In Schlüsselfeldern nicht zulässige Zeichen

Die folgenden Zeichen sind in Werten für die Eigenschaften PartitionKey und RowKey nicht zulässig:

Der Schrägstrich (/)

Der umgekehrte Schrägstrich (\)

Das Nummernzeichen (#)

Das Fragezeichen (?)

Steuerzeichen von U + 0000 bis U + 001F, einschließlich:

  • Das horizontale Tabulatorzeichen (\ t)

  • Das Zeilenvorschubzeichen (\ n)

  • Das Wagenrücklaufzeichen (\ r)

Steuerzeichen von U + 007F bis U + 009F 

Beachten Sie, dass ich zusätzlich zu den erwähnten Zeichen im MSDN-Artikel auch das Zeichen% char zu dem Muster hinzugefügt habe, da ich an einigen Stellen gesehen habe, dass es problematisch ist. Ich denke, einiges davon hängt auch von der Sprache und der Technologie ab, die Sie für den Zugriff auf den Tabellenspeicher verwenden.

Wenn Sie in Ihrem Fall weitere problematische Zeichen entdecken, können Sie diese zum Regex-Muster hinzufügen. Daran muss sich nichts ändern.

12
Dogu Arslan

Ich habe gerade herausgefunden (auf die harte Tour), dass das '+' Zeichen erlaubt ist, aber nicht in PartitionKey abgefragt werden kann.

6
Hans Olav

Ich habe festgestellt, dass zusätzlich zu den in Igoreks Antwort aufgeführten Zeichen auch diese Probleme verursachen können (beispielsweise werden Einfügungen fehlschlagen):

  • |
  • []
  • {}
  • <>
  • $ ^ &

Mit dem Azure Node.js-SDK getestet.

5
laktak

Darüber hinaus können Sie am Anfang eines Partitionsschlüssels keinen Unterstrich _ verwenden. Es wird der Fehler zurückgegeben, dass ein mit einem Unterstrich beginnender Schlüssel kein gültiger Partitionsschlüssel ist.

1
Remi