Как ударить URL-адрес api отдыха от asp.net MVC 5 - PullRequest
0 голосов
/ 05 октября 2018

На самом деле я хочу нажать на ссылку (если я нажал на ту же ссылку из браузера, на мой номер приходит SMS, но не с кода), чтобы отправить смс на мобильный телефон.тот же код работает для меня в приложении C # windows, но в mvc выдает ошибку как исключение [ Асинхронная операция не может быть запущена в данный момент.Асинхронные операции могут быть запущены только внутри асинхронного обработчика или модуля или во время определенных событий в жизненном цикле страницы.Если это исключение произошло во время выполнения страницы, убедитесь, что страница помечена как <% @ Page Async = "true"%>.Это исключение может также указывать на попытку вызова метода «async void», который обычно не поддерживается при обработке запроса ASP.NET.Вместо этого асинхронный метод должен возвращать задачу, а вызывающая сторона должна ждать ее. ]

Пример кода в MVC-5

    void sendSMS(string name, string mobile)
    {
        try
        {
            string mobNumber = mobile; 
            string message = "Hello "+name+" your request submitted successfully.";
            string apiToken = "xxxxxxxxxxx";
            string smsSender = "xxxxxx";
            string apiKey = "test@gmail.com";

            string url = "http://somewebsite.com/Restapis/send_sms?api_key=" + apiKey + "&api_token=" + apiToken + "&sender=" + smsSender + "&receiver=" + mobNumber + "&msgtype=1&sms=" + message + "";

            GetRequest(url, mobNumber);

        }
        catch(Exception ex){ }
    }

    public async static void GetRequest(string url, string mob)
    {
        using (HttpClient client = new HttpClient())
        {
            using (HttpResponseMessage response = await client.GetAsync(url))
            {
                using (HttpContent content = response.Content)
                {
                    HttpContentHeaders headers = content.Headers;
                    if (response.ReasonPhrase == "OK") { }
                }
            }
        }
    }

Над этим же кодом работает в приложении Windowsно не в ASP.NET MVC.

Пожалуйста, кто-нибудь предоставит подсказку или решение.Заранее спасибо.

1 Ответ

0 голосов
/ 05 октября 2018

Это известная проблема в ASP.NET.

Замените эту строку:

using (HttpResponseMessage response = await client.GetAsync(url))

На это:

using (HttpResponseMessage response = await client.GetAsync(url).ConfigureAwait(false))

Вам необходимо использовать ConfigureAwait, иначе потоки будут блокироваться.

Проверьте этот пост для получения более подробной информации.

Итак, в соответствии с этим, ASP.NET имеет специализированный контекст синхронизации, который может иметь только один поток.И если вы не используете .ConfigureAwait (false), он пытается восстановить старый контекст, который принадлежит основному потоку, заблокированному .Result, следовательно, тупик.

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