Damo
Damo

Reputation: 2070

Azure IOT ExportDevicesAsync internal server error

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

Answers (1)

Rita Han
Rita Han

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

Related Questions