【问题标题】:How to send byte array in jmeter post request如何在jmeter post请求中发送字节数组
【发布时间】:2017-08-23 11:17:43
【问题描述】:

有一个 WCF 服务。我必须访问的方法有 1 个参数作为输入,其类型是 Stream。

我不知道如何将流对象从 JMeter 提供给 WCF 服务。

目前我已经编写了一个 C# 方法(MVC 项目),它接受来自 JMeter 的字符串,然后将其转换为流类型对象,然后由 WCF 服务处理。但是这种方式不给也不给WCF服务的实际性能

[WebInvoke(UriTemplate = "", Method = "POST")]
    [OperationContract]
    public Stream ReceiveChirp(Stream fileContents)
    {
        string response = "";
        long ticks = DateTime.Now.Ticks;
        DateTime receiveTime = DateTime.Now;

目前我遇到了对象类型的异常。

这是一个例外:

       <p class="heading1">Request Error</p>
    <p xmlns="">The server encountered an error processing the request. Please see the <a rel="help-page" href="http://t2vnmeterservicessciexp.cloudapp.net/ReceiveChirp/help">service help page</a> for constructing valid requests to the service. The exception message is 'Object reference not set to an instance of an object.'. See server logs for more details. The exception stack trace is: </p>
      <p>   at Base.VN.Core.Generic.GenericExtensions.ChirpGenerator.ConvertStringToByteArray(String input)
   at T2.VN.Core.MeterServices.MainEndPoint.ReceiveChirp(Stream fileContents)
   at SyncInvokeReceiveChirp(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</p>

我的同事用来进行相同单元测试的代码:

public string TestServicePacket(string data)
        {
            var url = "http://test.net/";
            var requestUrl = string.Format("{0}/ReceiveChirp/", url);
            var request = (HttpWebRequest)WebRequest.Create(requestUrl);
            request.Timeout = Timeout.Infinite;
            request.Method = "POST";
            request.ContentType = "text/plain";

            var dataTrailing = "&UserName=eReg&UserPassword=abc123";
            var dataTrailingBytes = Encoding.ASCII.GetBytes(dataTrailing);

            var bChirp = ConvertStringToByteArray(data);

            var ToSend = new byte[dataTrailingBytes.Length + bChirp.Length];
            ToSend = bChirp.Concat(dataTrailingBytes).ToArray();

            request.ContentLength = ToSend.Length;

            using (var requestStream = request.GetRequestStream())
            {
                // Send the file as body request.
                requestStream.Write(ToSend, 0, ToSend.Length);
                requestStream.Close();
            }
            var response = (HttpWebResponse)request.GetResponse();
            var responseStream = response.GetResponseStream();
            var memoryStream = new MemoryStream();
            string resultResponse;

            resultResponse = ConvertStream(responseStream);
            return resultResponse;
        }

【问题讨论】:

  • 您能否添加异常以及您的测试计划是什么样的?

标签: automation jmeter performance-testing jmeter-plugins


【解决方案1】:

我相信最简单的方法是使用 HTTP Raw RequestRaw Data Source 插件,因为 JMeter 的 HTTP 请求采样器参数仅限于字符串,而使用这些插件,您可以将“原始”字节数组与 HTTP 请求一起发送。

您可以使用JMeter Plugins Manager 安装这两个测试元素

【讨论】:

  • 您能否详细说明一下,我看到了这个解决方案,但是我如何在发布请求中提供我的十六进制字符串作为字节数组。
【解决方案2】:

我们可以在这里使用 Java Request Sampler。我们可以编写自定义代码在字节流中创建我们自己的数据并执行 GET/POST。 我们可以查看 HttpSampler 的代码,在 post/get 方法中,我们可以返回一个字节数组而不是 String。

通过 Http Sampler 无法发送字节数组。即 HTTP 采样器仅适用于字符串

【讨论】:

    猜你喜欢
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多