2017-09-05 69 views
0

这是处理设备通知逻辑的Azure Web应用程序的控制器代码。我正在做的是从ASP MVC控制器调用下面显示的代码。但是当我运行它时,我得到了来自浏览器的挂起请求(挂起)。 我有一个按钮,单击时它会调用控制器中的唤醒方法。从MVC Web应用程序发送到Azure IoT Hub设备时应用程序挂起

该代码与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(); 
     } 
+0

这个问题是太一般了,我建议你尝试做一个远程调试会话,看看究竟在何处你的代码失败。 https://docs.microsoft.com/en-us/visualstudio/debugger/remote-debugging-azure –

回答

1

尝试以下操作:

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

     System.Threading.ThreadPool.QueueUserWorkItem(a => SendCloudToDeviceMessageAsync().Wait()); 
    } 
+0

它的工作。你能解释一下问题所在吗? – TheChosenOne94

+0

问题出在同步方法内部的等待死锁。使用ThreadPool.QueueUserWorkItem是产生该方法的一个快速解决方法。更好的解决方案是使用异步控制器,请参阅更多详细信息:https://msdn.microsoft.com/en-us/library/ee728598%28v=vs.100%29.aspx,https://stackoverflow.com/问题/ 20227401 /使用-等待-taskt-异步-挂起控制器-在-MVC应用内 –

相关问题