with what started pricing kind how framework dotnet delete are azure azure-table-storage

what - Azure Table Storage RowKey patrones de caracteres restringidos?



get started with azure table (5)

¿Hay patrones de caracteres restringidos dentro de Azure TableStorage RowKeys? No he podido encontrar ninguna documentada a través de numerosas búsquedas. Sin embargo, estoy obteniendo un comportamiento que lo implica en algunas pruebas de rendimiento.

Tengo un comportamiento extraño con RowKeys que consiste en caracteres aleatorios (el controlador de prueba evita que los caracteres restringidos (/ / #?) Además de bloquear comillas simples ocurran en RowKey). El resultado es que tengo un RowKey que se insertará bien en la tabla, pero no se puede consultar (el resultado es InvalidInput). Por ejemplo:

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

Si intenta realizar una consulta por este RowKwy (igualdad), se producirá un error (tanto en nuestra aplicación, utilizando Azure Storage Explorer, como en Cloud Storage Studio 2). Eché un vistazo a la solicitud que se envía a través de Fiddler:

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

Parece que% 54 en RowKey no se escapó en el filtro. Curiosamente, obtengo un comportamiento similar para las solicitudes por lotes al almacenamiento de tablas con URI en el XML por lotes que incluye este RowKey. También he visto un comportamiento similar para RowKeys con comillas dobles incrustadas, aunque todavía no he aislado ese patrón.

¿Alguien me ha explicado este comportamiento? Puedo restringir fácilmente la aparición de caracteres adicionales en RowKeys, pero realmente me gustaría saber las ''reglas''.


Acabo de descubrir (por las malas) que el signo ''+'' está permitido, pero no es posible consultar en PartitionKey.


Además de lo anterior, tampoco puede usar un guión bajo _ al comienzo de una tecla de partición, se devuelve un error que indica que una clave que comienza con un guión bajo no es una clave de partición válida.


Descubrí que, además de los caracteres enumerados en la respuesta de Igorek, estos también pueden causar problemas (por ejemplo, los insertos fallarán):

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

Probado con el SDK de Azure Node.js.


Los siguientes caracteres no están permitidos en los campos PartitionKey y RowKey:

  • El carácter de barra diagonal (/)
  • El carácter de barra invertida ( / )
  • El caracter del signo numérico (#)
  • El carácter de interrogación (?)

Consulte el siguiente artículo para obtener más información: http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx


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

Detección de partición de tabla inválida y claves de fila:

bool invalidKey = DisallowedCharsInTableKeys.IsMatch(tableKey);

Desinfección de la partición inválida o clave de fila:

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

En esta etapa, es posible que también desee añadir un prefijo a la clave desinfectada (clave de partición o clave de fila) con el hash de la clave original para evitar colisiones falsas de claves inválidas diferentes que tengan el mismo valor desinfectado.

No use la cadena. GetCashCode (), ya que puede producir un código hash diferente para la misma cadena y no se utilizará para identificar la singularidad y no se conservará.

Yo uso SHA256: https://msdn.microsoft.com/en-us/library/s02tk69a(v=vs.110).aspx

para crear el hash de matriz de bytes de la clave no válida, convierta el conjunto de bytes a cadena hexadecimal y prefija la clave de tabla desinfectada con eso.

Consulte también la documentación relacionada de MSDN: https://msdn.microsoft.com/en-us/library/azure/dd179338.aspx

Sección relacionada del enlace: Caracteres no permitidos en campos clave

Los siguientes caracteres no están permitidos en los valores de las propiedades PartitionKey y RowKey:

El carácter de barra diagonal (/)

El carácter de barra invertida (/)

El caracter del signo numérico (#)

El carácter de interrogación (?)

Controle los caracteres de U + 0000 a U + 001F, incluidos:

  • El carácter de tabulación horizontal (/ t)

  • El carácter de salto de línea (/ n)

  • El carácter de retorno de carro (/ r)

Controle los caracteres de U + 007F a U + 009F

Tenga en cuenta que, además de los caracteres mencionados en el artículo de MSDN, también agregué el% de caracteres al patrón, ya que vi en algunos lugares donde la gente menciona que es problemático. Supongo que algo de esto también depende del idioma y la tecnología que está utilizando para acceder al almacenamiento de la tabla.

Si detecta caracteres problemáticos adicionales en su caso, puede agregarlos al patrón de expresiones regulares, nada más debe cambiar.