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
Извините, эта статья на итальянском, я не нашел английскую версию.