2

Webサービスのテストに使用する小さなツールがあります。

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を使用してGETメソッドの80スレッドを実行できますが、POSTメソッドの80スレッドは95%のCPUを使用します。

POSTの使用に関して本質的に高価なものはありますか?POSTメソッドを最適化するためにできることはありますか?異なるクライアントからのリクエストをシミュレートしたいので、接続を再利用できません。

dotTraceは、POSTを使用すると、処理時間の65%がwebRequest.GetResponse()に費やされると報告しています。

基盤となるWebサービスは、違いが生じる場合はDigest-Authenticationを使用します。

4

1 に答える 1

3

最終的な uri の複雑さによっては、「GET」リクエストがキャッシュされている可能性があります。「POST」はデフォルトではキャッシュされませんが、「GET」はキャッシュされることがよくあります (冪等であるため)。ここに違いがあるかどうかを確認するためにスニッフィングを試みましたか?

WebClientまた、次のような方が使いやすいかもしれません。

using (WebClient wc = new WebClient())
{
    byte[] fromGet = wc.DownloadData(uriWithData);
    byte[] fromPost = wc.UploadData(uri, data);
}
于 2009-01-06T12:41:34.333 に答える