Http客户端两次发送请求

时间:2018-10-09 06:25:52

标签: c# httplistener

我正在使用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 :(得分:0)

这是分布式应用程序中非常普遍的问题。您提出请求,有人得到了请求,有时无法完成请求。此外,有时您会收到响应,有时则不会。为了应对这种情况,经验法则是“您的命令/请求应等幂”。我的意思是,即使您多次向服务发送请求/命令,结果也不会改变,并且该命令只能执行一次。有时完成此操作可能会非常复杂,但是对于简单的情况,您只需在请求中添加命令ID,并在服务器中添加命令日志即可完成此操作。服务器收到请求后,首先检查该命令是否已经执行。如果之前执行过,则返回相同的成功响应,否则运行命令。