400 Error means there's something wrong with the value of one of your properties. One way to find out is to trace the request/response through Fiddler and see the actual data being sent to Windows Azure Storage.
Taking a wild guess, I'm assuming by taking a quick glance at your code that in your model you have some Date/Time type properties (OfflineTimestamp, OnlineTimestamp) and observed that in certain scenarios one of them is initialized with the default value which is "DateTime.MinValue". Please note that the minimum value allowed for a Date/Time type attribute is Jan 1, 1601 (UTC) in Windows Azure[http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx]. Please see if that's not the case. If that's the case, then you could make them nullable type fields so that they don't get populated with the default values.
Have a look at Juha Palomäki's answer below as well... there sometimes is a slightly more useful message in the exception where he suggests (RequestInformation.ExtendedErrorInformation.ErrorMessage)
The StorageException contains also a little bit more detailed information about error.
Check in debugger: StorageException.RequestInformation.ExtendedInformation
In my case it was a forward slash in the RowKey.
I also received an 'OutOfRangeInput - One of the request inputs is out of range.' error when trying to add manually through the storage emulator.
Characters Disallowed in Key Fields
The following characters are not allowed in values for the PartitionKey and RowKey properties:
- The forward slash (/) character
- The backslash (\) character
- The number sign (#) character
- The question mark (?) character
- Control characters from U+0000 to U+001F, including:
- The horizontal tab (\t) character
- The linefeed (\n) character
- The carriage return (\r) character
- Control characters from U+007F to U+009F
http://msdn.microsoft.com/en-us/library/dd179338.aspx
I wrote an extension method to handle this for me.
public static string ToAzureKeyString(this string str)
{
var sb = new StringBuilder();
foreach (var c in str
.Where(c => c != '/'
&& c != '\\'
&& c != '#'
&& c != '/'
&& c != '?'
&& !char.IsControl(c)))
sb.Append(c);
return sb.ToString();
}
I faced the same issue but the reason in my case was due to size. After digging into the additional exception properties (RequestInformation.ExtendedErrorInformation), found the reason:
ErrorCode : PropertyValueTooLarge ErrorMessage: The property value exceeds the maximum allowed size (64KB). If the property value is a string, it is UTF-16 encoded and the maximum number of characters should be 32K or less.
well, in my case i was trying to do this:
CloudBlobContainer container = blobClient.GetContainerReference("SessionMaterials");
await container.CreateIfNotExistsAsync();
because of ContainerName SessionMaterials
(as a habit writing in Pascal Case and Camel Case :D) it was causing 400 bad request. So,
I just have to make it sessionmaterials
.
and it worked.
Hope this helps some one.
PS:- Just check exception http response or use fiddler to capture request and response.
in my case : Container name was in capital letter. there are limitations when using chars.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With