Hej,
było już coś takiego jednak do dziś nie znalazłem rozwiązania w necie. Uprościłem przykład do takiej postaci. Generalnie z poziomu usługi windowsowej chce puszczać POSTa do bramki sms co 1 min.
public partial class Service1 : ServiceBase
{
public static readonly string API_URL = "https://api1.serwersms.pl/zdalnie/";
public Dictionary<string, string> _content;
public string _path = @"D:\log_service.txt";
private readonly IMessageService _messageService;
private readonly IMessageRepository _messageRepository;
private static HttpClient client = new HttpClient();
private Timer timer;
public Service1(IMessageService messageService, IMessageRepository messageRepository)
{
InitializeComponent();
_messageService = messageService;
_messageRepository = messageRepository;
}
protected override void OnStart(string[] args)
{
timer = new Timer(TimeSpan.FromMinutes(1).TotalMilliseconds);
timer.AutoReset = true;
timer.Enabled = true;
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Start();
}
private async void timer_Elapsed(object sender, ElapsedEventArgs e)
{
var _message = _messageRepository.GetByStatus(status.inQueue);
{
foreach (Message m in _message)
{
_content = Services.Utils.SmsApiConfiguration.GetConfig();
_content.Add("wiadomosc", m.MessageBody);
_content.Add("numer", m.Phone);
_content.Add("akcja", "wyslij_sms");
var httpContent = new FormUrlEncodedContent(_content);
try
{
var response = await client.PostAsync(API_URL, httpContent);
if (response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
File.AppendAllText(_path, Environment.NewLine + " " + responseContent);
}
}
catch (Exception ex)
{
File.AppendAllText(_path, Environment.NewLine + " " + ex);
}
}
}
}
protected override void OnStop()
{
timer.Stop();
timer = null;
}
}
Zupełnie nie potrafię poprawić tego tak aby zadziałało poprawnie tzn.
W kolejce są dwie wiadomości do wysłania i nigdy, dla przykładu nie wyrzucam ich z kolejki. I teraz:
- Uruchamiam serwis.
- 1szy Timer Tick -> wszystko się wysyła
- 2gi Timer Tick -> próba PostAsync() ( 1sza wiadomość ) dostaję
System.Net.WebException: Żądanie zostało przerwane: Nie można utworzyć bezpiecznego kanału SSL/TLS.
druga wiadomość leci bez problemu
i tak w kółko. Gdy w kolejce mam 10 wiadomości, za 1szym razem wszystko leci, kolejne "tiknięcia" 1sza wiadomość przerwanie, pozostałe 9 bez problemu.
Robię to na Win 10 i szczerze pomału mam dość i zaczynam myśleć o zrobieniu tego jak zwykłą apkę konsolową i zapakowaniu tego w zaplanowane zadania. Bo w ten sposób chodzi. Co tutaj może być nie tak?
Kombinuję teraz z Fiddlerem jeszcze.
Target framework: 4.6.1.
Dostawca bramki używa TLS1.2