【问题标题】:Parametrising encoded web service requests参数化编码的 Web 服务请求
【发布时间】:2013-10-14 13:32:00
【问题描述】:

我正在尝试在 Web 性能测试中对 Web 服务请求进行参数化。使用 Fiddler2,我记录了由我的桌面应用程序执行的事务的 60 多个 Web 服务请求序列,并将它们保存为 .webtest 文件。此 Web 测试运行没有任何错误,并且我检查的响应看起来正确。

当在 Visual Studio 2012 中查看 Web 服务请求时,它们以纯文本形式出现,因此我应该能够编辑它们以参数化 SOAP 请求中的值。例如,大多数请求都包含文本<Database>db1a</Database>(实际上它有<Database>db1a</Database>),我想更改它们以从上下文参数中获取数据库名称。还有其他几个项目可以用参数替换。对于这一交易,有超过 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/ 的“Web and Load Test Plugins for Visual Studio Team Test 3.0 版。它们为一次编辑一个 SOAP 请求提供了更好的界面。但它们不允许大规模更改。

将 Web 测试转换为编码的 Web 测试(即转换为 C#)将 SOAP 请求显示为简单的文本,并且可以在那里对其进行编辑,但我更愿意保持 .webtest 文件的灵活性。

更新:我已经发布了该问题的部分答案。虽然它有效,但感觉做这项工作的方式是错误的,因为它感觉太复杂了。所以我正在寻找一种更好的整体方法。

【问题讨论】:

    标签: web-services visual-studio-2012 soap fiddler web-testing


    【解决方案1】:

    StringHttpBody 是 base64 编码的。请求的原始正文被转换为 UTF-16 字节数组,然后进行 base64 编码,如下所示:

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

    为了快速查看,您可以将此字符串复制/粘贴到 Fiddler 的工具 > TextWizard 屏幕,然后使用 From Base64 选项进行解码。

    【讨论】:

    • 这很棒@ErikLaw。使用 Fiddler 解码为 Base64 会显示带有问号的菱形与其他字符交替出现。在 C# 中通过 Convert.FromBase64String() 解码会得到 0x00 与(非正式地)有意义的 Ascii 字符交替出现。所以它看起来像代码平面零中的 UTF-16。
    【解决方案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文件上,编码操作是解码操作的逆操作,解码前的原始文件与编码后的文件相同。有了这两个中间文件,就可以轻松检查和搜索未编码文件的内容以及parameterise 步骤的效果。

    【讨论】:

      【解决方案3】:

      对于

      [StringHttpBody ContentType="application/json"]

      解码身体:

      var encodedString = childNode.InnerText;

      var encodedStringBytes = Convert.FromBase64String(encodedString);

      var decodedString = Encoding.Unicode.GetString(encodedStringBytes);

      JObject jsonString =JsonConvert.DeserializeObject(decodedString);

      对正文进行编码:

      childNode.InnerText = Convert.ToBase64String(Encoding.Unicode.GetBytes(JsonConvert.SerializeObject(jsonString)));

      我认为这可能会有所帮助。

      【讨论】:

      • 感谢@raghavendrap 的想法。与我的回答有相似之处,您已经确定了一些减少代码量的库函数。但是,我不确定您的某些想法是否适合整理 Visual Studio Web 性能测试的参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2017-03-10
      • 2011-06-24
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多