2017-03-07 4 views
1

Ich arbeite an einer Lösung, in der ich alle Geräte von einem IoTHub zu einem BLOB exportieren möchte.Azure IoTHub ExportDevicesAsync löst internen Serverfehler aus

Microsoft hat hierfür eine API und erklärt, wie man das macht here.

Ich habe diesen Code für 10 Geräte ausgeführt und es funktioniert gut, es dauert ein paar Sekunden für Azure, um dies zu verarbeiten, aber ansonsten funktioniert es gut.

jedoch mit mehr als 10 Geräten arbeite ich an einer S1-Plattform (derzeit mit 100 Geräten zu testen), die diese

eine unbestimmte Menge von Geräten unterstützen soll, ist der Code, den ich benutzt habe.

Program.cs

private static void Main(string[] args) 
    { 
     IoTExporter.ExportIoTDevices(); 
    } 

IoTExporter

public class IoTExporter 
{ 
    private const string Containername = "iot"; 

    public static void ExportIoTDevices() 
    { 
     // Create a blobclient which is used to connect to the blob storage. 
     var blobClient = CreateBlobClient(); 

     //Get a reference to a container to use for the sample code, and create it if it does not exist. 
     var container = blobClient.GetContainerReference(Containername); 
     container.CreateIfNotExists(); 

     //Generate a SAS token and assign it to the current job. 
     var storageUri = GetContainerSasUri(container); 
     CreateJob(storageUri); 

     Console.ReadLine(); 
    } 

    /// <summary> 
    /// Create a blobclient which is used to connect to the blob storage. 
    /// </summary> 
    /// <returns>A Blob client.</returns> 
    private static CloudBlobClient CreateBlobClient() 
    { 
     var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("BlobConnString")); 
     return storageAccount.CreateCloudBlobClient(); 
    } 

    private static string GetContainerSasUri(CloudBlobContainer container) 
    { 
     ConsoleWriter.WriteLine("Generating Uri"); 

     // Set constraints on the SAS token. 
     var sasConstraints = new SharedAccessBlobPolicy 
     { 
      SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10), 
      Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read | 
          SharedAccessBlobPermissions.Delete 
     }; 

     var sasContainerToken = container.GetSharedAccessSignature(sasConstraints); 

     //Return the URI string for the container, including the SAS token. 
     return container.Uri + sasContainerToken; 
    } 

    private static async void CreateJob(string storageUri) 
    { 
     ConsoleWriter.WriteLine("Creating Job"); 
     var manager = RegistryManager.CreateFromConnectionString(ConfigurationManager.AppSettings["IoT:ConnectionString"]); 

     await TestConnection(manager); 

     ConsoleWriter.WriteLine("Initiating Job"); 
     var job = await manager.ExportDevicesAsync(storageUri, "devices.txt", false); 
     await DoJob(job, manager); 
    } 

    private static async Task TestConnection(RegistryManager manager) 
    { 
     ConsoleWriter.WriteLine("Testing if connected to IoTHub"); 
     var devices = await manager.GetDevicesAsync(1); 
     if (!devices.Any()) 
     { 
      Environment.Exit(-1); 
     } 

     else 
     { 
      ConsoleWriter.WriteLine("IoT connected"); 
     } 
    } 

    private static async Task DoJob(JobProperties job, RegistryManager manager) 
    { 
     while (true) 
     { 
      job = await manager.GetJobAsync(job.JobId); 
      switch (job.Status) 
      { 
       case JobStatus.Completed: 
        FileWriter.WriteBlobToFile(GetContainer()); 
        ConsoleWriter.WriteLine($"Job {job.Status}"); 
        break; 
       case JobStatus.Failed: 
        ConsoleWriter.WriteLine($"Job failed due to {job.FailureReason}"); 
        break; 
       case JobStatus.Cancelled: 
        ConsoleWriter.WriteLine($"Job {job.Status}"); 
        break; 
       default: 
        ConsoleWriter.WriteLine($"Status of job: {job.Status}"); 
        await Task.Delay(TimeSpan.FromSeconds(5)); 
        continue; 
      } 
      break; 
     } 
    } 

    private static CloudBlobContainer GetContainer() 
    { 
     var blobClient = CreateBlobClient(); 

     // Retrieve a reference to a container and give it blob permissions. 
     var container = blobClient.GetContainerReference(Containername); 
     return container; 
    }}} 

ConsoleWriter

public static class ConsoleWriter 
{ 
    public static void WriteLine(string line) 
    { 
     var date = DateTime.Now; 
     var toWrite = $"{date} : {line}"; 
     Console.WriteLine(toWrite); 
    } 
} 

Ist mein Code der probl Em, oder gibt es noch etwas anderes im Topf?

+0

Ich teste Ihren Code mit 100 Geräten auf F1-Free Tier, es funktioniert. Was sind Ihre detaillierten Fehlerinformationen? –

+0

Es stellte sich heraus, dass der Server, auf dem ich arbeitete (Westeuropa) eine Fehlfunktion hatte. Ich habe es in Nordeuropa getestet und jetzt funktioniert es! – Azgramah

Antwort

2

Es stellt sich heraus, dass der Server, auf dem ich arbeitete (Westeuropa) eine Fehlfunktion hatte. Ich habe es in Nordeuropa getestet und jetzt funktioniert es.

Verwandte Themen