Dec 05 2017 05:51 AM
Hi Guys,
I am facing one issue.
I am running a web job in Azure app service which is reading events from IoTHub.
After running for sometimes the web job throws an error:
Microsoft.WindowsAzure.Storage.StorageException occurred
HResult=0x80131500
Message=The client could not finish the operation within the specified timeout.
Source=Microsoft.WindowsAzure.Storage
StackTrace:
at Microsoft.WindowsAzure.Storage.Core.Util.StorageAsyncResult`1.End() in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Util\StorageAsyncResult.cs:line 77
at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.EndUploadFromStream(IAsyncResult asyncResult) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 774
at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.EndUploadFromByteArray(IAsyncResult asyncResult) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 1162
at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.EndUploadText(IAsyncResult asyncResult) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 1285
at Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.<>c__DisplayClass4.<CreateCallbackVoid>b__3(IAsyncResult ar) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Util\AsyncExtensions.cs:line 114
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) in f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\TaskAwaiter.cs:line 184
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) in f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\TaskAwaiter.cs:line 156
at Microsoft.Azure.WebJobs.Host.Loggers.UpdateOutputLogCommand.<UpdateOutputBlob>d__18.MoveNext()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) in f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\TaskAwaiter.cs:line 184
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) in f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\TaskAwaiter.cs:line 156
at Microsoft.Azure.WebJobs.Host.Loggers.UpdateOutputLogCommand.<TryExecuteAsync>d__14.MoveNext()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) in f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\TaskAwaiter.cs:line 184
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) in f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\TaskAwaiter.cs:line 156
at Microsoft.Azure.WebJobs.Host.Timers.RecurrentTaskSeriesCommand.<ExecuteAsync>d__3.MoveNext()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) in f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\TaskAwaiter.cs:line 184
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) in f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\TaskAwaiter.cs:line 156
at Microsoft.Azure.WebJobs.Host.Timers.TaskSeriesTimer.<RunAsync>d__14.MoveNext()
at Microsoft.Azure.WebJobs.Host.Timers.WebJobsExceptionHandler.<>c__DisplayClass3_0.<OnUnhandledExceptionAsync>b__0()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state) in f:\dd\ndp\clr\src\BCL\system\threading\thread.cs:line 68
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) in f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs:line 954
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) in f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs:line 901
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) in f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs:line 890
at System.Threading.ThreadHelper.ThreadStart() in f:\dd\ndp\clr\src\BCL\system\threading\thread.cs:line 105
Inner Exception 1:
TimeoutException: The client could not finish the operation within the specified timeout.
I tried to fix the problem by adding lines in Program.cs
using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.ServiceBus; using System; namespace RoomDetails.WebJob { // To learn more about Microsoft Azure WebJobs SDK, please see https://go.microsoft.com/fwlink/?LinkID=320976 class Program { static string eventHubName = "interelcloud-ehout"; static string connectionString = "Endpoint=sb://interelcloud.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=XXXXX"; // Please set the following connection strings in app.config for this WebJob to run: // AzureWebJobsDashboard and AzureWebJobsStorage static void Main() { var config = new JobHostConfiguration(); config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(60); config.Queues.VisibilityTimeout = TimeSpan.FromSeconds(60); var eventHubConfig = new EventHubConfiguration(); eventHubConfig.AddReceiver(eventHubName, connectionString); config.UseEventHub(eventHubConfig); JobHost host = new JobHost(config); if (config.IsDevelopment) { config.UseDevelopmentSettings(); } // The following code ensures that the WebJob will be running continuously host.RunAndBlock(); } } }
functions.cs is
namespace RoomDetails.WebJob { /// <summary> /// Class Functions. /// </summary> public class Functions { static HttpClient client = new HttpClient(); /// <summary> /// The container /// </summary> private static readonly IContainer Container; /// <summary> /// The room logic /// </summary> private static IRoomLogic _roomLogic; /// <summary> /// Initializes static members of the <see cref="Functions"/> class. /// </summary> static Functions() { // client.BaseAddress = new Uri("http://interelrc.azurewebsites.net/"); client.BaseAddress = new Uri("http://localhost:65224/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var builder = new ContainerBuilder(); builder.RegisterModule(new WebAutofacModule()); builder.RegisterType<ConfigurationProvider>().As<IConfigurationProvider>(); Container = builder.Build(); } static async Task UpdateFanMode(string fanMode, string roomNumber, string eventDate) { HttpResponseMessage response = await client.PostAsJsonAsync($"rooms/updatefanmode?roomNumber={roomNumber}&fanmode={fanMode}&eventDate={eventDate}", ""); response.EnsureSuccessStatusCode(); // Return the URI of the created resource. //return response.Headers.Location; } static async Task UpdateSetPoint(string setPoint, string roomNumber, string eventDate) { HttpResponseMessage response = await client.PostAsJsonAsync($"rooms/updatesetpoint?roomNumber={roomNumber}&setpoint={setPoint}&eventDate={eventDate}", ""); response.EnsureSuccessStatusCode(); // Return the URI of the created resource. //return response.Headers.Location; } static async Task UpdateUpgradeStatus(string status, string roomNumber) { HttpResponseMessage response = await client.PostAsJsonAsync($"rooms/updateupgradestatus?roomNumber={roomNumber}&status={status}", ""); response.EnsureSuccessStatusCode(); // Return the URI of the created resource. //return response.Headers.Location; } static async Task UpdateDndMurStatus(string status, string roomNumber, string eventDate) { HttpResponseMessage response = await client.PostAsJsonAsync($"rooms/updateDndMurStatus?roomNumber={roomNumber}&status={status}&eventDate={eventDate}", ""); response.EnsureSuccessStatusCode(); } static async Task UpdateUserPresenceStatus(string status, string roomNumber, string eventDate) { HttpResponseMessage response = await client.PostAsJsonAsync($"rooms/updateUserPresenceStatus?roomNumber={roomNumber}&status={status}&eventDate={eventDate}", ""); response.EnsureSuccessStatusCode(); } /// <summary> /// Triggers the specified message. /// </summary> /// <param name="message">The message.</param> /// <returns>Task.</returns> public static async Task Trigger([EventHubTrigger("interelcloud-ehout")] string message) { try { string data = message; _roomLogic = Container.Resolve<IRoomLogic>(); if (data.Contains("category") && data.Contains("Connections")) { try { DeviceConnectionMessage[] deviceConnectionMessage = JsonConvert.DeserializeObject<DeviceConnectionMessage[]>(data); foreach (var item in deviceConnectionMessage) { var hotelRoom = await _roomLogic.GetRoomByDeviceIdAsync(item.deviceId); hotelRoom.IsRoomOnline = (item.operationName == "deviceConnect"); await _roomLogic.UpdateRoomAsync(hotelRoom); } } catch (Exception e) { throw; } } else if (data.Contains("operation") && data.Contains("UPGRADE")) { var payload = JsonConvert.DeserializeObject<UpgradPayload>(data); var hotelRoom = await _roomLogic.GetHotelRoomAsync(payload.RoomNumber, payload.HotelName); hotelRoom.RoomRCUs[0].Status = payload.Status; if (!string.IsNullOrEmpty(payload.Version)) { hotelRoom.RoomRCUs[0].InstalledDate= payload.UpgradeDate; hotelRoom.RoomRCUs[0].FirmwareVersion = payload.Version; } await _roomLogic.UpdateRoomAsync(hotelRoom); await UpdateUpgradeStatus(payload.Status, payload.RoomNumber); } else { DeviceTelemetry deviceTelemetry = JsonConvert.DeserializeObject<DeviceTelemetry>(data); var hotelRoom = await _roomLogic.GetHotelRoomAsync(deviceTelemetry.roomNumber.ToString(), deviceTelemetry.hotelname); string eventDate = hotelRoom._tsUpd?.ToString("dd-MM-yyyy hh:mm:ss"); if (data.Contains("fanSpeed")) { hotelRoom.FanMode = GetFanModeText(deviceTelemetry.fanSpeed); await UpdateFanMode(hotelRoom.FanMode, hotelRoom.RoomNumber, eventDate); } if (data.Contains("roomTemperature")) { hotelRoom.ActualTemperature = (float)deviceTelemetry.roomTemperature; } if (data.Contains("setPoint")) { hotelRoom.SetPoint = (float)deviceTelemetry.setPoint; await UpdateSetPoint(hotelRoom.SetPoint.ToString(), hotelRoom.RoomNumber, eventDate); } else if (data.Contains("dnd")) { await UpdateDndMurStatus($"{deviceTelemetry.dnd.ToString()}-{deviceTelemetry.mur.ToString()}", hotelRoom.RoomNumber, eventDate); hotelRoom.DndState = deviceTelemetry.dnd; hotelRoom.MurState = deviceTelemetry.mur; } else if (data.Contains("presence")) { hotelRoom.PresenceStatus = deviceTelemetry.presence; await UpdateUserPresenceStatus($"{deviceTelemetry.presence.ToString()}", hotelRoom.RoomNumber, eventDate); } await _roomLogic.UpdateRoomAsync(hotelRoom); } Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"At {DateTime.Now} Message received. Data: '{data}'"); Console.ResetColor(); } catch (Exception ex) { throw ex.InnerException; } } /// <summary> /// Gets the fan mode text. /// </summary> /// <param name="fanMode">The fan mode.</param> /// <returns>System.String.</returns> private static string GetFanModeText(int fanMode) { switch (fanMode) { case 1: return "Low"; case 2: return "Medium"; case 3: return "High"; case 4: return "Auto"; case 5: return "Eco"; case 6: return "Off"; } return ""; } } public class UpgradPayload { [JsonProperty("deviceId")] public string DeviceId { get; set; } [JsonProperty("operation")] public string Operation { get; set; } [JsonProperty("status")] public string Status { get; set; } [JsonProperty("hotelName")] public string HotelName { get; set; } [JsonProperty("roomNumber")] public string RoomNumber { get; set; } [JsonProperty("upgradeDate")] public DateTime UpgradeDate { get; set; } [JsonProperty("version")] public string Version { get; set; } } }
IoTHub Subscription ID: a11bf993-e71f-43ff-b512-647cee60e4c6
I would be grateful if you provide me with a solution.
Thanks and best regards,