我有一个用于测试网络服务的小工具。
它可以使用POST或使用GET来调用Web服务。
使用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运行80个GET方法的线程,而POST方法的80个线程使用95%的CPU。
使用POST有什么本质上更昂贵的东西吗?有什么办法可以优化POST方法吗?我无法重用连接,因为我想模拟来自不同客户端的请求。
dotTrace报告,在使用POST时,65%的处理时间用于webRequest.GetResponse()。
如果存在任何差异,则底层Web服务使用摘要式身份验证。
答案 0 :(得分:3)
那么,根据最终uri的复杂性,可能会缓存“GET”请求?默认情况下,“POST”不会被缓存,但“GET”通常是(因为它应该是幂等的)。您是否尝试过嗅探以确定这里是否有任何区别?
此外 - 您可能会发现WebClient
更容易使用 - 例如:
using (WebClient wc = new WebClient())
{
byte[] fromGet = wc.DownloadData(uriWithData);
byte[] fromPost = wc.UploadData(uri, data);
}