Не могу поймать исключение в ASP.NET MVC - PullRequest
0 голосов
/ 29 мая 2018

В настоящее время я пытаюсь разработать простое веб-приложение для моего школьного проекта IoT.На данный момент он должен вызывать только прямые методы из моей малины.Я использую Azure SDK для C #.

Вот как выглядит код:

Контроллер:

    public ActionResult changeState(int? id, bool enable)
    {
        string conn_str = (from u in db.Users join h in db.Hubs on
                u.Hub.HubId equals h.HubId
                where u.UserName == User.Identity.Name select h.connection_str).First();

        Cloud2Device c2d = new Cloud2Device(conn_str);

        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Rp rp = db.Rps.SingleOrDefault(r => r.RpId == id);
        if (rp == null)
        {
            return HttpNotFound();
        }
        //IoT stuff
        try
        {
           c2d.EnableRaspberry("myDeviceId").Wait();
        }
        catch(Exception ex)
        {
           //do something
        }
        rp.is_enabled = enable;
        db.SaveChanges();
        return RedirectToAction("Index");
    }

IoT использует:

public class Cloud2Device
{
    private ServiceClient s_serviceClient;

    public Cloud2Device(string conn_str)
    {
        s_serviceClient = ServiceClient.CreateFromConnectionString(conn_str);
    }

    public async Task EnableRaspberry(string deviceId)
    {
        var methodInvocation = new CloudToDeviceMethod("EnableRaspberry") { ResponseTimeout = TimeSpan.FromSeconds(2) };

         var response = await s_serviceClient.InvokeDeviceMethodAsync(deviceId, methodInvocation);
        Debug.WriteLine(response.GetPayloadAsJson());
    }
}

Проблема в том, что из отладочного вывода я вижу, что исключение Microsoft.Azure.Devices.Common.Exceptions.DeviceNotFoundException было сгенерировано, однако оно не обрабатывается блоком try-catch.

вывод консоли

    Application Insights Telemetry (unconfigured): "name":"Microsoft.ApplicationInsights.Dev.RemoteDependency","time":"2018-05-29T12:04:59.4748528Z","tags":{"ai.internal.sdkVersion":"rddf:2.2.0-738","ai.internal.nodeName":"5CG6455YJ4.ericsson.se","ai.cloud.roleInstance":"5CG6455YJ4.ericsson.se"},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"/twins/myDeviceId/methods","id":"8/ZMgqG4iNc=","data":"https://utiliothub.azure-devices.net/twins/myDeviceId/methods?api-version=2017-10-15","duration":"00:00:01.2380000","resultCode":"404","success":false,"type":"Http","target":"utiliothub.azure-devices.net","properties":{"DeveloperMode":"true"}}}}
    Exception thrown:'Microsoft.Azure.Devices.Common.Exceptions.DeviceNotFoundException' in Microsoft.Azure.Devices.dll
    Exception thrown:'Microsoft.Azure.Devices.Common.Exceptions.DeviceNotFoundException' in mscorlib.dll
    The thread 0x3834 has exited with code 0 (0x0).

Может кто-нибудь посоветовать, как я могу поймать и обработать это исключение в моем приложении?Заранее спасибо за ответ.

1 Ответ

0 голосов
/ 29 мая 2018

Я не уверен, что вывод ошибок на самом деле является исключением, возникающим в вашем коде.Это может быть ApplicationInsights, просто входя в систему. Однако я думаю, что код заморожен из-за вызова Wait и блокировки возврата из асинхронного метода.

Сделайте метод контроллера возвращаемым типом Task<ActionResult>, сделайте этот метод async, затем используйте await c2d.EnableRaspberry("myDeviceId"); для вызова этого метода.

Посмотрите, приведет ли это к исключению (или успеху).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...