小编krd*_*rd-的帖子

HttpWebRequest如何处理(过早)关闭底层TCP连接?

在使用.NET的HttpWebRequest类调用远程服务器(特别是REST Web服务)时,我很难搞清楚是否有办法处理潜在的连接问题.从我的调查来看,WebClient类的行为是相同的,这是有点预期的,因为它似乎只提供了一个更简单的HttpWebRequest接口.

出于模拟目的,我编写了一个非常简单的HTTP服务器,它不符合HTTP 1.1 RFC.它的作用是接受客户端连接,然后发送适当的HTTP 1.1头和"Hello World!".有效负载返回客户端并关闭套接字,服务器端接受客户端连接的线程如下所示:

    private const string m_defaultResponse = "<html><body><h1>Hello World!</h1></body></html>";
    private void Listen()
    {
        while (true)
        {
            using (TcpClient clientConnection = m_listener.AcceptTcpClient())
            {
                NetworkStream stream = clientConnection.GetStream();
                StringBuilder httpData = new StringBuilder("HTTP/1.1 200 OK\r\nServer: ivy\r\nContent-Type: text/html\r\n");
                httpData.AppendFormat("Content-Length: {0}\r\n\r\n", m_defaultResponse.Length);
                httpData.AppendFormat(m_defaultResponse);

                Thread.Sleep(3000); // Sleep to simulate latency

                stream.Write(Encoding.ASCII.GetBytes(httpData.ToString()), 0, httpData.Length);

                stream.Close();

                clientConnection.Close();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

由于HTTP 1.1 RFC声明HTTP 1.1默认保持连接活动,并且服务器必须发送"Connection:Close"响应头,如果它想要关闭连接,这是客户端的意外行为.客户端以下列方式使用HttpWebRequest:

    private static void SendRequest(object _state)
    {
        WebResponse resp = null;

        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.0.32:7070/asdasd");
            request.Timeout = …
Run Code Online (Sandbox Code Playgroud)

c# networking httpwebrequest

11
推荐指数
2
解决办法
8485
查看次数

标签 统计

c# ×1

httpwebrequest ×1

networking ×1