Ejecuté esto en modo de depuración y adjunto una imagen con los detalles de la excepción. ¿Cómo puedo saber qué salió mal? Estaba intentando insertar datos en una tabla. ¿No puede azure darme más detalles?
Obs: el almacenamiento está en Windows Azure, no en mi máquina. Se crearon las tablas, pero obtengo este error al insertar datos
// 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();
y aquí está el código de inserción:
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);
}
}
Respuestas:
400 Error significa que hay algún problema con el valor de una de sus propiedades. Una forma de averiguarlo es rastrear la solicitud / respuesta a través de Fiddler y ver los datos reales que se envían a Windows Azure Storage.
Tomando una suposición salvaje, supongo que, al echar un vistazo rápido a su código, en su modelo tiene algunas propiedades de tipo Fecha / Hora (OfflineTimestamp, OnlineTimestamp) y observé que en ciertos escenarios uno de ellos se inicializa con el valor predeterminado que es " DateTime.MinValue ". Tenga en cuenta que el valor mínimo permitido para un atributo de tipo de fecha / hora es el 1 de enero de 1601 (UTC) en Windows Azure [http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx] . Por favor, vea si ese no es el caso. Si ese es el caso, puede convertirlos en campos de tipo anulable para que no se llenen con los valores predeterminados.
Eche un vistazo a la respuesta de Juha Palomäki a continuación también ... a veces hay un mensaje un poco más útil en la excepción donde sugiere (RequestInformation.ExtendedErrorInformation.ErrorMessage)
fuente
StorageException también contiene información un poco más detallada sobre el error.
Comprobar en el depurador: StorageException.RequestInformation.ExtendedInformation
fuente
The specifed resource name contains invalid characters.
el nombre de mi mesa tenía guiones ... al igual que los nombres de mi cola ... suspiro. ¡Esperamos que la búsqueda recoja esto para más personas! ver: stackoverflow.com/questions/45305556/…En mi caso, fue una barra diagonal en RowKey .
También recibí un 'OutOfRangeInput: una de las entradas de solicitud está fuera de rango'. Error al intentar agregar manualmente a través del emulador de almacenamiento.
http://msdn.microsoft.com/en-us/library/dd179338.aspx
Escribí un método de extensión para manejar esto por mí.
fuente
Enfrenté el mismo problema, pero la razón en mi caso se debió al tamaño. Después de profundizar en las propiedades de excepción adicionales (RequestInformation.ExtendedErrorInformation), encontré el motivo:
ErrorCode: PropertyValueTooLarge ErrorMessage: El valor de la propiedad excede el tamaño máximo permitido (64 KB). Si el valor de la propiedad es una cadena, está codificado en UTF-16 y el número máximo de caracteres debe ser 32 K o menos.
fuente
bueno, en mi caso estaba tratando de hacer esto:
debido a ContainerName
SessionMaterials
(como un hábito de escribir en Pascal Case y Camel Case: D) estaba causando 400 solicitudes incorrectas. Entonces, solo tengo que hacerlosessionmaterials
. Y funcionó.Espero que esto ayude a alguien.
PD: - Simplemente verifique la respuesta http de excepción o use Fiddler para capturar la solicitud y la respuesta.
fuente
en mi caso: El nombre del contenedor estaba en mayúscula. existen limitaciones al usar caracteres.
fuente
A veces es porque tu
partitionKey
orowKey
esNULL
(fue el caso para mí)
fuente
Puede encontrar una documentación de MS sobre todos los códigos de error del servicio de mesa aquí
fuente
Tuve el mismo error BadRequest (400), al final lo llené manualmente:
Y funcionó para mí. ¡Espero que esto ayude!
fuente
Timestamp
debe generar manualmente. Es muy molesto.También enfrenté el mismo tipo de problema. En mi caso, el valor de PartitionKey no se estableció, por lo que, por defecto, el valor de PartitionKey era nulo, lo que resultó en una
Object reference not set to an instance of an object.
excepciónVerifique si está proporcionando los valores apropiados para PartitionKey o RowKey, puede enfrentar tal problema.
fuente
Arreglé mis casos y funcionó bien
Mis casos:
fuente
Recibí una solicitud incorrecta de 400 porque estaba usando ZRS (Zone Redundant Storage) y Analytics no está disponible para este tipo de almacenamiento. No sabía que estaba usando Analytics.
Eliminé el contenedor de almacenamiento y lo recreé como GRS y ahora funciona bien.
fuente
Recibía una solicitud incorrecta (400), StatusMessage: Solicitud incorrecta, Código de error: OutOfRangeInput cuando la entidad tenía una propiedad DateTime no establecida (= DateTime.MinValue)
fuente
En mi caso: incluí metadatos de blob con un nombre de etiqueta que contenía un guión.
El guión
"added-by"
fue el problema, y luego RTFM me dijo que los nombres de las etiquetas deben ajustarse a las convenciones de identificadores de C #.Árbitro: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata
El subrayado funciona bien.
fuente
En mi caso, no debería agregar PartitionKey y Rowkey en mi clase de entidad. Debería ser de la clase base. A continuación simplemente funcionaría.
fuente
Si está utilizando NodeJS y tropezó con esta publicación, solo para descubrir que no obtiene esa hermosa información detallada en su objeto de error; puede utilizar un proxy para obtener esos detalles. Sin embargo, dado que nadie aquí menciona CÓMO usar un proxy.
La forma más sencilla con NodeJS es establecer dos variables ambientales:
Si realmente está utilizando C #, como lo está haciendo el autor de esta publicación; simplemente puede instalar Fiddler y configurarlo para interceptar. Por defecto, debería interceptar las solicitudes. Es posible que también deba confiar en el certificado de Fiddler o hacer el equivalente de "NODE_TLS_REJECT_UNAUTHORIZED = 0" del nodo.
fuente
Obtuve una respuesta 400-BadRequest de la API de tabla de cuentas de almacenamiento de Azure. La información de excepción mostró que "La cuenta a la que se accede no es compatible con http". Supuse que debemos usar https en la cadena de conexión cuando "Se requiere transferencia segura" está habilitado en la configuración de la cuenta de almacenamiento, como se muestra en la siguiente imagen.
fuente
En mi caso, para crear una nueva instalación de la clase "TableBotDataStore" (marco de bots de MS), pasamos el parámetro "tableName" con un guión como "master-bot" y TableBotDataStore puede tener nombres de tabla solo con letras y números.
fuente
Tuve el mismo problema, la función pasaba
containerNameKey
como cadena. a continuación se muestra el código que dio errorLo cambié a
Funcionó
fuente