Clickatell Не удалось отправить SMS - приложение C# Winforms

Я пользовался сервисом clickatell последние пару недель, отправляя SMS каждое утро на несколько номеров мобильных телефонов, до сегодняшнего дня никаких проблем не возникало:

System.Net.WebException: базовое соединение было закрыто: при отправке произошла непредвиденная ошибка. ---> System.IO.IOException: аутентификация не удалась, потому что удаленная сторона закрыла транспортный поток.

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

Я проверил свою учетную запись clickatell, и у нее по-прежнему много кредитов, и интеграция включена.

Есть идеи, что идет не так?

2 ответа

Решение

После отсутствия ответа от clickatell я немного покопался и нашел эту тему...

"Базовое соединение было закрыто: при отправке произошла непредвиденная ошибка". С сертификатом SSL

Поскольку я использую.net 4, я попытался добавить эту строку кода в класс отдыха, который я получил от clickatell...

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

Добавление этого кода, похоже, снова заставило систему работать..

Итак, если вы используете.net4 и REST API, это код, который вам нужен:

class Rest
{
    //This takes the API Key and JSON array of data and posts it to the Message URL to send the SMS's
    public static string Post(string Token, string json)
    {
        var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://platform.clickatell.com/messages");
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";
        httpWebRequest.Accept = "application/json";
        httpWebRequest.PreAuthenticate = true;
        httpWebRequest.Headers.Add("Authorization", Token);

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            streamWriter.Write(json);
            streamWriter.Flush();
            streamWriter.Close();
        }
        ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var result = streamReader.ReadToEnd();
            return result;
        }
   }
}

надеюсь, это поможет кому-то еще....

Да, SecurityProtocol должен быть Transport Layer Security 1.2 (3072 - это значение перечисления Tls12 SecurityProtocolType).

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

С.net 4.6 Microsoft обновила ограничения безопасности для ssl.

Если вы хотите больше, прочтите это: ServicePointManager o SslStream API в.net 4.6

Извините, эта статья на итальянском, я не нашел английскую версию.

Другие вопросы по тегам