【问题标题】:Make HttpWebRequest ignoring response使 HttpWebRequest 忽略响应
【发布时间】:2016-02-29 01:41:21
【问题描述】:

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

我已经对 WebClientHttpWebRequest 进行了测试,根据经验,我看到后者的性能更好。

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

Jon Skeet

请注意,您确实需要处理 request.GetResponse 返回的 WebResponse - 否则底层基础架构不会知道您实际上已经完成了它,并且将无法重用连接。

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 数据的速度,并尽快回到主程序流程。因为我正在跟踪程序流程,所以最好使用同步写入,但不是强制性的,因为我总是可以添加一个包含 Tick 计数的 POST 字段。

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

【问题讨论】:

    标签: c# .net-4.0 httpwebrequest


    【解决方案1】:

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

    您只有在调用GetResponseStream 时才能获得响应数据。如果您不想收到有关请求成功/错误的信息,您也不必知道服务器是否成功处理了请求。

    所以答案是:

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

    【讨论】:

    • 谢谢 :-) 不,我肯定不想在套接字级别工作。我需要调用GetResponse 以关闭/重用连接是否正确?
    • 是的,你说得对。在您的代码中,GetResponse() 会自动关闭,因为您将其包装在 using 中。
    • using 它是我的意图。再次感谢:-)
    猜你喜欢
    • 1970-01-01
    • 2014-10-18
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多