Reputation: 2070
Same problem as here. I'm following the simple sample to export the IOT device list to blob storage but hitting an internal server error on ExportDevicesAsync. I'm using North Europe, but I don't think changing servers is really a valid fix.
All I'm getting back is:
An exception of type 'Microsoft.Azure.Devices.Common.Exceptions.ServerErrorException' occurred in mscorlib.dll but was not handled in user code
Additional information: {"Message":"ErrorCode:ServerError;InternalServerError","ExceptionMessage":"Tracking ID:c51dad0227604f21b9af3e8acbd77f4c-G:5-TimeStamp:06/03/2017 19:56:10"}
Sample Code (connection strings and keys masked)
internal async Task GetAllDevices()
{
var ConnectionString =
"HostName=xxxx.azure-devices.net;SharedAccessKeyName=xxxxowner;SharedAccessKey=xxxxLr3xxxxXKKILLxxxxx";
registryManager = RegistryManager.CreateFromConnectionString(ConnectionString);
var key = "https://xxxxotblob1.blob.core.windows.newt/?sv=2016-05-31&ss=bfqt&srt=sco&sp=rwdlxxxxup&se=2017-06-04T04:42:14Z&st=2017-06-03T20:42:14Z&spr=https&sig=kxxxxxxxxxxxxxxx%3D";
JobProperties exportJob = await registryManager.ExportDevicesAsync(key,"device.txt", false);
while (true)
{
exportJob = await registryManager.GetJobAsync(exportJob.JobId);
if (exportJob.Status == JobStatus.Completed ||
exportJob.Status == JobStatus.Failed ||
exportJob.Status == JobStatus.Cancelled)
{
break;
}
await Task.Delay(TimeSpan.FromSeconds(5));
}
}
Am I doing something wrong here? Is there a way to catch the real exception I'm missing?
Upvotes: 1
Views: 273
Reputation: 9700
You may have wrong format of the exportBlobContainerUri. The right one looks like this:
https://[StorageAccountName].blob.core.windows.net/[ContainerName]?sv=2016-05-31&sr=c&sig=mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxw%3D&se=2017-06-06T02%3A07%3A22Z&sp=rwd
You can follow these steps to get the container SAS URI:
//1# Get your container:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
//2# Format the Uri:
static string GetContainerSasUri(CloudBlobContainer container)
{
var sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24);
sasConstraints.Permissions =
SharedAccessBlobPermissions.Write |
SharedAccessBlobPermissions.Read |
SharedAccessBlobPermissions.Delete;
string sasContainerToken = container.GetSharedAccessSignature(sasConstraints);
return container.Uri + sasContainerToken;
}
For more information you can reference Create a container and Get the container SAS URI.
Upvotes: 1