public static async Task Run(
            [QueueTrigger("newpets", Connection = "StorageConnectionString")] string queueItem,
            ILogger logger,
            [ServiceLocator] IServiceProvider serviceProvider,
            [Config] IConfiguration config)
        {
            var httpClientFactory = serviceProvider.GetRequiredService <IHttpClientFactory>();
            var petService        = serviceProvider.GetRequiredService <PetService>();

            var _storage = CloudStorageAccount.Parse(config.GetValue <string>("StorageConnectionString")).CreateCloudBlobClient();

            // Deserialize queue message
            var petFromQueue = JsonConvert.DeserializeObject <Pet>(queueItem);

            // Download image
            var blob  = new CloudBlockBlob(new Uri(petFromQueue.ImageUrl), _storage);
            var image = await blob.DownloadBlobAsync();

            // Call Cognitive Services Computer Vision
            var client = httpClientFactory.CreateClient();

            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", config.GetValue <string>("ComputerVision"));
            var response = await client.PostAsync(ComputerVisionUrl, image);

            if (response.IsSuccessStatusCode)
            {
                // Upload image to blob
                var thumbnail = await response.Content.ReadAsStreamAsync();

                await blob.UploadFromStreamAsync(thumbnail);

                // publish pet
                var pet = await petService.GetPetAsync(petFromQueue.Id, petFromQueue.Type);

                pet.Published = true;
                await petService.UpdatePetAsync(pet);
            }
            else
            {
                var result = await response.Content.ReadAsStringAsync();

                logger.LogError(result);
            }
        }