C# 如何使用JMeter测试WCF Web服务?

C# 如何使用JMeter测试WCF Web服务?,c#,web-services,soap,jmeter,C#,Web Services,Soap,Jmeter,我有一个托管在IIS上的WCF Webservice,它公开了一个接受三个整数参数的方法。我有一个简单的、基于控制台的客户端,可以调用这个方法 int InsertNewOrder(short quantity, int custID, int productID); 如果我的理解是正确的,我需要向JMeter提供一个SOAP信封,其中包含要调用的方法和要传递的参数的详细信息。我见过许多类似于以下的例子: <soapenv:Envelope xmlns:soapenv="schemas.

我有一个托管在IIS上的WCF Webservice,它公开了一个接受三个整数参数的方法。我有一个简单的、基于控制台的客户端,可以调用这个方法

int InsertNewOrder(short quantity, int custID, int productID);
如果我的理解是正确的,我需要向JMeter提供一个SOAP信封,其中包含要调用的方法和要传递的参数的详细信息。我见过许多类似于以下的例子:

<soapenv:Envelope xmlns:soapenv="schemas.xmlsoap.org/soap/envelope/">; 
<soapenv:Body>
<ns2:InsertNewOrder xmlns:ns2="?????"> 
<ns2:Param1>${1}</ns2:Param1> 
<ns2:Param1>${1}</ns2:Param1> 
<ns2:Param1>${1}</ns2:Param1> 
</ns2:InsertNewOrder>  
</soapenv:Body>
</soapenv:Envelope>
;
${1} 
${1} 
${1} 
然而,通过查看我的WSDL文档,我看不到它在哪里引用了传递给该方法所需的任何参数。我还使用Fiddler检查了客户端发送给服务的soap消息。同样,我看不到它在哪里传递参数。因此,我不知道如何创建一个简单的SOAP信封,我可以使用JMeter来测试这个服务

有人能告诉我为什么WSDL文档没有提供方法参数的任何细节,或者解释我如何创建必要的SOAP信封以便与JMeter一起使用吗

我使用VS2010、JMeter 2.4、IISV6、wsHttpBinding用C#编写代码

免责声明:我不是WSDL专家,所以我无法告诉您为什么文档没有提供详细信息

为了为JMeter生成SOAP信封,我使用了soapUI的免费版本

台阶
  • 将WSDL导入soap
  • 为该方法创建默认请求
  • 将请求视图设置为RAW,并复制到JMeter中
  • 这为我提供了jmeter所需的所有信息,包括参数、用户代理、端点等。

    使用jmeter的“HTTP代理服务器”记录普通测试客户端的WCF调用,然后在稍后测试时播放它们。这是我经历过的最快的测试,并给出了最好的测试用例(因为您使用普通客户机或选择的测试客户机记录它们)

    将JMeters HTTP代理服务器设置为。然后,确保WCF(或任何SOAP)客户端使用该代理。WCF客户端配置的重要部分是(用普通配置替换我的…):

    
    ...
    ...
    
    如果WCF客户端与JMeter在同一台计算机上运行(创建测试用例时正常),则proxyServerName为localhost

    另外,如果我没有如上所示关闭安全性,我使用HTTP代理收到一条错误消息。WCF服务服务器上也必须具有相同的安全设置


    快乐测试!:-)

    非常感谢。这正是我所需要的。它还以与我查看原始XML时不同的方式显示WSDL。我现在可以看到参数等。很高兴我能帮忙。事实上,我发现这可以大大节省时间。通过使用SoapUI,我看到它还执行负载测试(这基本上就是我想要做的)。你觉得一个工具比另一个更好吗?我本来打算使用JMeter,但之前没有听说过SoapUI。我对SoapUI的负载测试工具不是很喜欢(SoapUI中既有loadUI,也有性能测试工具)。我发现它们比JMeter更难自定义。@BlackGaff:我在原始请求视图中看到的不是
    soap:envelope
    标记,而是
    GET http:…
    。我能做什么?请帮忙。
    <system.serviceModel>
        <bindings>
        ...
        <wsHttpBinding>
        <binding ...  proxyAddress="http://proxyServerName:8080" useDefaultWebProxy="false" ...>
        ...
            <security mode="None">
                <message establishSecurityContext="false"/>
                <transport clientCredentialType="None"/>
            </security>