使 HttpWebRequest 忽略响应

Make HttpWebRequest ignoring response

我有一个自定义 WebUploadTraceListener : TraceListener,用于将 HTTP(最终是 HTTPS)POST 数据发送到将数据写入数据库的 Web 服务。

我已经用 WebClientHttpWebRequest 进行了测试,根据经验,我发现后者的性能更好。

由于数据的单向性,我不关心服务器响应。但是我发现如果我不处理 HttpWebResponse 我的代码会在第三次写入时锁定。我认为这是因为 DefaultConnectionLimit 设置和系统不重用资源...

Jon Skeet

Note that you do need to dispose of the WebResponse returned by request.GetResponse - otherwise the underlying infrastructure won't know that you're actually done with it, and won't be able to reuse the connection.

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(ServiceURI);
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";

try
{
    using (Stream stream = httpRequest.GetRequestStream())
    {
        stream.Write(postBytes, 0, postBytes.Length);
    }

    using (HttpWebResponse response = (HttpWebResponse)httpRequest.GetResponse())
    {
        /// discard response
    }
}
catch (Exception)
{
    /// ...
}

我想最大限度地提高发送 POST 数据的速度,并尽快返回主程序流程。因为我正在跟踪程序流,所以同步写入更可取,但不是强制性的,因为我总是可以添加一个 POST 字段,其中包括一个 Tick 计数。

  1. HttpWebRequeststream.Write 是在 .Net4.0 中最快的方法吗?
  2. 是否有更便宜的方法来丢弃不需要的响应?

实际上,httpRequest.GetResponse只有post数据到服务器,不向客户端下载任何东西,除了告诉客户端请求是否被服务器成功处理的信息。

只有在调用GetResponseStream时才会得到响应数据。如果您不想收到关于请求的 success/error 的信息,您无论如何都无法判断服务器是否成功处理了请求。

所以答案是:

  1. 是的,这是托管代码的最低级别,除非你想搞砸 带套接字(你不应该)
  2. HttpWebRequest,没有。你几乎得不到任何数据 你不要。