C# https 请求总是隧道到服务器,但 Java 只有一次

Nay*_*iya 5 c# java network-programming http

我正在将 JAVA 程序转换为https向服务器发送请求的C# 。这是我登录到服务器然后从服务器注销的程序。

  var login_httpWebRequest = (HttpWebRequest)WebRequest.Create(m_base_url + "session/login");
  login_httpWebRequest.ContentType = "application/json; charset=UTF-8";

  var logout_httpWebRequest = (HttpWebRequest)WebRequest.Create(m_base_url + "session/logout");
  logout_httpWebRequest.ContentType = "application/json; charset=UTF-8";

  CookieContainer cookieJar = new CookieContainer();
  login_httpWebRequest.CookieContainer = cookieJar;


  using (StreamWriter streamWriter = new StreamWriter(login_httpWebRequest.GetRequestStream()))
  {
      streamWriter.Write("{username:xxxxxx,password:yyyyyyy}");
  }
  var httpResponse = (HttpWebResponse)login_httpWebRequest.GetResponse();
  var login_cookies = httpResponse.Cookies;

  logout_httpWebRequest.CookieContainer = new CookieContainer();
  httpWebRequest.CookieContainer.Add(login_cookies);
  using (StreamWriter streamWriter = new StreamWriter(logout_httpWebRequest.GetRequestStream()))
  {
      streamWriter.Write("{}");
  }

  var httpResponse = (HttpWebResponse)login_httpWebRequest.GetResponse();
Run Code Online (Sandbox Code Playgroud)

但是我的 C# 程序比原来的 JAVA 程序花费更多的时间,然后我使用 Fiddler 工具检查了请求。所以我为每个请求找到了到服务器的 C# 隧道。但是JAVA程序只有一次。

波纹管图片

  • 绿色表示 JAVA 程序发送到服务器的请求(tunnel->login->logout)。
  • 红色显示 C# 程序发送到服务器的 C# 程序请求(tunnel->login->tunnel->logout)。

在此处输入图片说明

任何人都知道如何避免 C# Http 客户端对每个请求进行隧道传输。

Bri*_*anM 4

您是否尝试过使用 HttpClient 而不是 WebRequest?我写了这篇文章,但无法测试它,所以希望它接近......

    using (HttpClientHandler handler = new HttpClientHandler())
    {
        CookieContainer cookies = new CookieContainer();
        handler.CookieContainer = cookies;

        using (HttpClient httpClient = new HttpClient(handler))
        {
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json; charset=UTF-8"));

            HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, m_base_url + "session/login");
            requestMessage.Content = new StringContent("{username:xxxxxx,password:yyyyyyy}"); ;

            HttpResponseMessage loginResponse = await httpClient.SendAsync(requestMessage);

            // The HttpClient should already have the cookies from the login so
            // no need to transfer
            requestMessage = new HttpRequestMessage(HttpMethod.Get, m_base_url + "session/logout");
            requestMessage.Content = new StringContent("{}");

            HttpResponseMessage logoutResponse = await httpClient.SendAsync(requestMessage);
        }
    }
Run Code Online (Sandbox Code Playgroud)