Brak nowej inicjalizacji pola

Odpowiedz Nowy wątek
2018-09-17 14:15
0

Hej,

mam dwa pytania do kodu poniżej:

  1. czy _messageRepository przenieść do serwisu i do tegoż serwisu przekazać List<message> tak by metoda SendSms wywoływała tylko serwis?
  2. drugie wywołanie ( druga iteracja )
    var response = client.PostAsync(API_URL, httpContent).Result;

    nie przechodzi nawet do sprawdzenia warunku if i dostaję gdzieś w debugu
    "Żądanie zostało przerwane Nie można utworzyć bezpiecznego kanału SSL/TLS"

public class MessageService
    {
        public IEnumerable<Message> _message;

        private readonly IMessageRepository _messageRepository;
        private readonly ISerwerSMSService _serwerSMSService;

        public MessageService(IMessageRepository messageRepository, ISerwerSMSService serwerSMSService)
        {
            _messageRepository = messageRepository;
            _serwerSMSService = serwerSMSService;
        }

        public void SendSms()
        {
            _message = _messageRepository.GetByStatus(status.inQueue);

            foreach (Message m in _message)
            {
                var res = _serwerSMSService.Send(m);
            }
        }
    }

SerwerSmsService

public class SerwerSMSService : ISerwerSMSService
    {
        public static readonly string API_URL = "https://api1.serwersms.pl/zdalnie/";

        public Dictionary<string, string> _content = new Dictionary<string, string>();

        public SerwerSMSService()
        {
            _content = Extensions.GetSmsApiConfiguration.GetConfig();
        }

        public async Task Send(Message message)
        {
            using (var client = new HttpClient())
            {
                _content.Add("wiadomosc", message.MessageBody);
                _content.Add("numer", message.Phone);
                _content.Add("akcja", "wyslij_sms");

                var httpContent = new FormUrlEncodedContent(_content);

                var response = client.PostAsync(API_URL, httpContent).Result; 

                if (response.IsSuccessStatusCode)
                {
                    var responseContent = response.Content;

                    string responseString = responseContent.ReadAsStringAsync().Result;
                }
            }          
        }
    }
edytowany 2x, ostatnio: john_doe, 2018-09-19 13:32

Pozostało 580 znaków

2018-09-17 15:35
0

Co do pytania pierwszego, może zamiast

_content.Add("wiadomosc", message.MessageBody);

spróbuj użyć:

_content["wiadomosc"] = message.MessageBody;

Itp.

Pozostało 580 znaków

2018-09-17 16:29
0

Pkt 1 rozwiazalem. Moj pospiech, prosta sprawa.

Pkt 3 gdy wysylam request po http wszystko chodzi
Chyba musze zwrocic sie do serwersms

Pozostało 580 znaków

2018-09-17 20:27
0

A spróbuj napisać tak:

 using (var client = new HttpClient())
            {
                  System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
             [...]

Pozostało 580 znaków

2018-09-18 10:42
0

próbowałem. Bez efektu.

Pozostało 580 znaków

2018-09-18 11:45
0

A zobacz ten temat.

edytowany 1x, ostatnio: lukaszek016, 2018-09-18 11:46

Pozostało 580 znaków

2018-09-18 14:09
0

nie pomogło.
Uruchomiłem to z powodzeniem na Win7 ( nawet na dwóch kompach z win 7 i ok ).
Coś się dzieje na Win 10 w tej kwestii. hmmmmmmmm

edytowany 1x, ostatnio: john_doe, 2018-09-18 15:25

Pozostało 580 znaków

2018-09-19 11:36
1

Po pierwsze nie blokuj asynchronicznego kodu. Możesz tym spowodować jakiś dead lock.
Po drugie nie twórz nowych instancji HttpClient tylko używaj jednej.

Pozostało 580 znaków

2018-09-19 13:02
0

dzięki, poprawiłem w ten sposób. Testuję na 2 skolejkowanych wiadomościach do wysłania.

public class SerwerSMSService : ISerwerSMSService
    {
        public static readonly string API_URL = "https://api1.serwersms.pl/zdalnie/";

        public Dictionary<string, string> _content;

        public async Task SendAsync(IEnumerable<Message> messages)
        {
            using (var client = new HttpClient())
            {
                foreach (Message m in messages)
                {
                    _content = Extensions.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();
                        }
                    }
                    catch (Exception ex)
                    {
                        File.AppendAllText(@"D:\log_service.txt", Environment.NewLine + " " + ex);
                    }
                }
            }
        }
    }

Kiedy odpalam to w w aplikacji konsolowej

        static void Main(string[] args)
        {

            MessageService message = new MessageService(new MessageRepository(), new SerwerSMSService());

            message.SendSms();

            Console.ReadKey();

        }

Wszystkie wiadomości dochodzą.

Chce zrobić Windowsowy Service

protected override void OnStart(string[] args)
        {
            Timer timer = new Timer();
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.Interval = TimeSpan.FromMinutes(1).TotalMilliseconds;
            timer.Enabled = true;
            timer.Start();
        }

        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            MessageService message = new MessageService(new MessageRepository(), new SerwerSMSService());

            message.SendSms();

        }

powiedzmy, że dla testu nie wyrzucam z kolejki wiadomości. przy 1szym tiknięciu timera obie wiadomości dochodzą.
Przy drugim dochodzi tylko druga a do 1szej exception i tak za każdym razem. Gdy próbuje wystać 4 wiadomości, za 1szym razem dochodzą wszystkie, kolejne ticki timera dochodzi 2,3,4 wiadomość a 1sza nie i tak za każdym razem.

System.Net.Http.HttpRequestException: Wystąpił błąd podczas wysyłania żądania. ---> System.Net.WebException: Żądanie zostało przerwane: Nie można utworzyć bezpiecznego kanału SSL/TLS.
w System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)
w System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)
--- Koniec śladu stosu wyjątków wewnętrznych ---
w System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
w System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
w System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
w Services.SerwerSMS.SerwerSMSService.<sendasync>d__3.MoveNext() w D:\PRACA\Projekty\SerwerSms\Services\SerwerSMS\SerwerSMSService.cs:wiersz 67

Czy może ja w serwisie coś nie tak robię? ( robię 1szy Windows Service )
Druga sprawa to gdy serwis zainstaluje na win7 wszystko chodzi jak marzenie. Na Win 10 Pro lub też Home działa to niestabilnie ( raz wysyła raz exception)

edytowany 2x, ostatnio: john_doe, 2018-09-19 15:47

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0