1

Web パフォーマンス テストで Web サービス リクエストをパラメータ化しようとしています。Fiddler2 を使用して、デスクトップ アプリケーションによって実行されたトランザクションに対する 60 を超える Web サービス リクエストのシーケンスを記録し、それらを.webtestファイルとして保存しました。この Web テストはエラーなしで実行され、確認した応答は正しいように見えます。

Web サービス リクエストを Visual Studio 2012 で表示すると、それらはプレーン テキストで表示されるため、それらを編集して SOAP リクエストの値をパラメータ化できるはずです。たとえば、ほとんどのリクエストにはテキストが含まれており<Database>db1a</Database>(実際には&lt;Database&gt;db1a&lt;/Database&gt;)、コンテキスト パラメータからデータベース名を取得するように変更したいと考えています。パラメータで置き換える項目は他にもいくつかあります。この 1 つのトランザクションには、60 を超える Web サービス リクエストがあり、他にも記録するトランザクションがあります。.webtestファイルには XML が含まれており、リクエストは次のようになります。

<Request Method="POST" Version="1.1" Url="http://example.com/somewhere.asmx" ThinkTime="83" Timeout="60" ParseDependentRequests="True" FollowRedirects="True" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8">
  <Headers>
    <Header Name="Content-Type" Value="text/xml; charset=utf-8" />
    <Header Name="SOAPAction" Value="&quot;http://example.com/webservices/VariousActionNamesHere&quot;" />
  </Headers>
  <StringHttpBody ContentType="text/xml; charset=utf-8">PAA/AHgAbQBsACAAdg
        ... lots more characters not shown
        +AA==</StringHttpBody>
</Request>

このStringHttpBodyフィールドには、SOAP 要求のエンコードされたバージョンが含まれています。Visual Studio ではプレーン テキストとして表示されます。このフィールドのエンコーディングは何ですか? また、どのようにデコードおよびエンコードできますか?

http://teamtestplugins.codeplex.com/から「<em>Visual Studio Team Test 用 Web およびロード テスト プラグイン」のリリース 3.0 をインストールしました。それらは、SOAP リクエストを 1 つずつ編集するためのわずかに優れたインターフェースを提供します。ただし、大量の変更は許可されません。

Web テストをコード化された Web テスト (つまり C#) に変換すると、SOAP 要求が単純なテキストとして表示され、そこで編集できますが、ファイルの柔軟性を維持したいと考えてい.webtestます。

更新:質問に対する部分的な回答を投稿しました。それは機能しますが、複雑すぎるため、作業のやり方が間違っているように感じます. だから私はより良い全体的なアプローチを探しています。

4

3 に答える 3

3

StringHttpBodybase64でエンコードされています。リクエストの生の本文は、UTF-16 バイト配列に変換されてから、次のように base64 でエンコードされます。

Convert.ToBase64String(Encoding.Unicode.GetBytes(oSession.GetRequestBodyAsString()));

すばやく表示するには、この文字列を Fiddler の [ツール] > [ TextWizard]画面にコピーして貼り付け、[ Base64 から] オプションを使用してデコードします。

于 2013-10-14T23:54:31.800 に答える
2

StringHttpBodyこれは、フィールドの操作に対する回答の一部です。これは、フィールドをデコードおよびエンコードして、理解しやすく変更できるようにすることです。

入力 XML を読み取り、StringHttpBodyフィールドの内容を見つけます。各フィールドの内容を、元の内容に対して次のルーチンを呼び出した結果に置き換えます。すべての行を新しい中間ファイルに書き込みます。バイト配列には、上位および下位バイトとして UTF-16 文字が含まれます。(これまでに見た文字はすべて上位バイトがゼロです。)

private string DecodeBody(string source) {
    byte[] outBytes = Convert.FromBase64String(source);
    StringBuilder sb = new StringBuilder();
    Assert( (outBytes.Length % 2) != 0 );
    for (int ix = 0; ix < outBytes.Length; ix += 2) {
        Assert(outBytes[ix] != 0);
        sb.Append((char)outBytes[ix + 1]);
    }
    return sb.ToString();
}

これで、ファイルの単純なテキスト バージョンを含むファイルが作成されました.webtest。このファイルは、リクエストのフィールドをパラメータ化するように簡単に編集できます。上記と同様のルーチンを使用して、別の中間ファイルに書き込みます。ルーチンには、次のようなステートメントがあります。

source = source.Replace("&lt;Database&gt;db1a&lt;/Database&gt;", "&lt;Database&gt;{{DatabaseName}}&lt;/Database&gt;");

その後、最終的な中間ファイルが再エンコードされて、新しい.webtestファイルが作成されます。前と同じように、StringHttpBodyフィールドの内容が検索され、ルーチンの呼び出し結果に置き換えられます。エンコーディング ルーチンは次のとおりです。

private string EncodeBody(string source) {
    StringBuilder sb = new StringBuilder();
    byte[] outBytes = new byte[2 * source.Length];
    for (int ix = 0; ix < source.Length; ix++)  {
        char ch = source[ix];
        outBytes[2 * ix] = (byte)(((int)ch) & 0xFF);
        outBytes[2 * ix + 1] = (byte)((((int)ch) / 256) & 0xFF);
    }
    sb.Append(Convert.ToBase64String(outBytes));
    return sb.ToString();
}

したがって、ファイルの流れは次のようになります。

decode original.webtest > intermediate1
parameterise intermediate1 > intermediate2
encode intermediate2 > final.webtest

私が試した少数の.webtestファイルでは、エンコード操作はデコード操作の逆であり、デコード前の元のファイルはエンコード後のファイルと同じです。2 つの中間ファイルがあると、エンコードされていないファイルの内容とステップの効果を簡単に確認および検索できますparameterise

于 2013-10-20T13:12:54.633 に答える