gpt4 book ai didi

c# - 使用 POST 的 HttpWebRequest 性能

转载 作者:行者123 更新时间:2023-11-30 22:50:44 25 4
gpt4 key购买 nike

我有一个用于测试网络服务的小工具。

它可以使用 POST 或使用 GET 调用网络服务。

使用POST的代码是

public void PerformRequest()
{
WebRequest webRequest = WebRequest.Create(_uri);

webRequest.ContentType = "application/ocsp-request";
webRequest.Method = "POST";
webRequest.Credentials = _credentials;
webRequest.ContentLength = _request.Length;
((HttpWebRequest)webRequest).KeepAlive = false;

using (Stream st = webRequest.GetRequestStream())
st.Write(_request, 0, _request.Length);

using (HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse())
using (Stream responseStream = httpWebResponse.GetResponseStream())
using (BufferedStream bufferedStream = new BufferedStream(responseStream))
using (BinaryReader reader = new BinaryReader(bufferedStream))
{
if (httpWebResponse.StatusCode != HttpStatusCode.OK)
throw new WebException("Got response status code: " + httpWebResponse.StatusCode);

byte[] response = reader.ReadBytes((int)httpWebResponse.ContentLength);
httpWebResponse.Close();
}
}

使用 GET 的代码是:

protected override void PerformRequest()
{
WebRequest webRequest = WebRequest.Create(_uri + "/" + Convert.ToBase64String(_request));

webRequest.Method = "GET";
webRequest.Credentials = _credentials;
((HttpWebRequest)webRequest).KeepAlive = false;

using (HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse())
using (Stream responseStream = httpWebResponse.GetResponseStream())
using (BufferedStream bufferedStream = new BufferedStream(responseStream))
using (BinaryReader reader = new BinaryReader(bufferedStream))
{
if (httpWebResponse.StatusCode != HttpStatusCode.OK)
throw new WebException("Got response status code: " + httpWebResponse.StatusCode);

byte[] response = reader.ReadBytes((int)httpWebResponse.ContentLength);
httpWebResponse.Close();
}
}

如您所见,代码非常相似。如果有的话,我希望 GET 方法稍微慢一些,因为它必须以 Base64 编码和传输数据。

但是当我运行它时,我发现 POST 方法比 GET 方法使用更多的处理能力。在我的机器上,我可以使用大约 5% 的 CPU 运行 GET 方法的 80 个线程,而 POST 方法的 80 个线程使用 95% 的 CPU。

使用 POST 有什么本质上更昂贵的地方吗?我可以做些什么来优化 POST 方法吗?我无法重用该连接,因为我想模拟来自不同客户端的请求。

dotTrace 报告说,使用 POST 时,65% 的处理时间花在了 webRequest.GetResponse() 上。

底层 web 服务使用 Digest-Authentication,如果有任何区别的话。

最佳答案

好吧,根据最终 uri 的复杂性,“GET”请求可能被缓存了? “POST”默认不缓存,但“GET”通常缓存(因为它应该是幂等的)。你试过嗅探看看这里有什么不同吗?

此外 - 您可能会发现 WebClient 更易于使用 - 类似于:

using (WebClient wc = new WebClient())
{
byte[] fromGet = wc.DownloadData(uriWithData);
byte[] fromPost = wc.UploadData(uri, data);
}

关于c# - 使用 POST 的 HttpWebRequest 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/416306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com