Приложение зависает при отправке из веб-приложения MVC на устройство Azure IoT Hub

Это код контроллера веб-приложения Azure, который обрабатывает логику уведомлений устройства. Что я делаю, так это вызываю код, показанный ниже, из контроллера ASP MVC. Но когда я запускаю его, я получаю постоянно ожидающий запрос от браузера (он зависает). У меня есть кнопка просмотра, при нажатии на которую вызывается метод Wakeup в контроллере.

Код не отличается от кода на MSDN для консольного приложения. Что мне не хватает?

using System.Text;
using Microsoft.Azure.Devices;

 public class MyTemplate2Controller : Controller
    {
        static ServiceClient serviceClient;
        static string connectionString = "HostName=azure-devices.net;SharedAccessKeyName=iothub;SharedAccessKey=mrUPt*2318C18K3LUk+oFarkNQ4vRvHrOa/eg=";

        private AsyncController Task SendCloudToDeviceMessageAsync()
        {
            var asd = "{13A20041677B0,4,15,0}";
            var commandMessage = new Message(Encoding.ASCII.GetBytes(asd));
          return  await serviceClient.SendAsync("Test_Comp_Dev_1", commandMessage).ConfigureAwait(continueOnCapturedContext: false);
        }
        public void Wakeup()
        {

            serviceClient = ServiceClient.CreateFromConnectionString(connectionString);

            SendCloudToDeviceMessageAsync().Wait();
        }

person TheChosenOne94    schedule 05.09.2017    source источник
comment
Этот вопрос слишком общий, я рекомендую вам попробовать провести сеанс удаленной отладки, чтобы увидеть, где именно ваш код дает сбой. docs.microsoft.com/en-us/visualstudio/debugger/   -  person Byron Tardif    schedule 06.09.2017


Ответы (1)


попробуйте следующее:

    public void Wakeup()
    {
        serviceClient = ServiceClient.CreateFromConnectionString(connectionString);

        System.Threading.ThreadPool.QueueUserWorkItem(a => SendCloudToDeviceMessageAsync().Wait());
    }
person Roman Kiss    schedule 06.09.2017
comment
Проблема была в тупиковой ситуации ожидания внутри метода синхронизации. Использование ThreadPool.QueueUserWorkItem было быстрым обходным путем для получения метода. Лучшим решением является использование асинхронного контроллера, см. дополнительные сведения: msdn.microsoft.com/en-us/library/ee728598%28v=vs.100%29.aspx, stackoverflow.com/questions/20227401/ - person Roman Kiss; 06.09.2017