Http Client отправляет запрос дважды - PullRequest
0 голосов
/ 09 октября 2018

Я использую http-клиент и http-сервер (слушатель). В некоторых случаях, когда у меня большой трафик задержки в моей сети, http-клиент отправляет запрос, но никогда не принимает ответ от http-слушателя. В результатеЯ пытаюсь отправить свой запрос на сервер.Но сервер уже принял предыдущий запрос и повторно запускает новый.В этом случае сервер выполняет мой запрос дважды.

httplistener

 HttpListener listener;
    Thread t;


    private void Form1_Load(object sender, EventArgs e)
    {

        t = new Thread(new ThreadStart(MyThreadMethod));
        t.IsBackground = true;
        listener = new HttpListener();
        listener.Prefixes.Add("http://192.168.0.214:8282/");
        listener.Start();
        t.Start();
       // label1.Text = "Opened";
    }
    void MyThreadMethod()
    {
        while (true)
        {
            IAsyncResult result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
            result.AsyncWaitHandle.WaitOne();
        }
    }
    public void ListenerCallback(IAsyncResult result)
    {

        HttpListener listener = (HttpListener)result.AsyncState;
        HttpListenerContext context = listener.EndGetContext(result);
        string methodName = Convert.ToString(context.Request.Url);

        //Here is my code

        string Response = "OK";
        HttpListenerResponse response = context.Response;
        string responseString = Convert.ToString(Response);
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
        response.ContentLength64 = buffer.Length;
        System.IO.Stream output = response.OutputStream;
        output.Write(buffer, 0, buffer.Length);
        output.Close();


    }

А вот мой httpClient

 HttpClient client = new HttpClient();
        var content = new StringContent("my Data", Encoding.UTF8, "application/json");
        var result = client.PostAsync("http://192.168.0.214:8282/", content).Result;

Как я могу предотвратить, когда у меня в сети большие delay_ms, http-слушатель работает дваждымои запросы?

1 Ответ

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

Это очень распространенная проблема для распределенных приложений.Вы делаете запрос, кто-то получает его, иногда выполнить запрос иногда не может.Кроме того, иногда вы получаете ответ, а иногда нет.Чтобы справиться с такими ситуациями, эмпирическое правило гласит: «Ваши команды / запросы должны быть idempotent ».Я имею в виду, что даже если вы отправляете запрос / команду несколько раз в службу, результат не должен изменяться, и команда должна выполняться только один раз.Выполнение этого иногда может быть очень сложным, но для простых сценариев вы можете просто сделать это, добавив идентификатор команды в свои запросы и журнал команд на свой сервер.Когда сервер получает запрос, он сначала проверяет, была ли эта команда уже выполнена.Если он был выполнен ранее, он возвращает тот же самый успешный ответ, в противном случае запускает команду.

...