加速c#中的SOAP请求

时间:2013-12-04 15:09:41

标签: c# multithreading soap asynchronous async-await

我有一段这样的代码:

  foreach (var e in foobar)
    {
      var myObj = new MyObj();

        GenericResult res = soapClient.doSomething(e);
        if(res.success == true){
            myObj.a = e.a;
            myObj.b = e.b;
        }
    }

每个soapRequest大约需要500毫秒,有时foobar是1000多个元素,所以我浪费了很多时间等待soapClient响应。我尝试使用Parallel.ForEach,但它不起作用,因为SOAP提供程序只接受序列化请求。提供商建议使用像async这样的soapClient.doSomthingAsync调用问题,在获得soapClient响应之前,我没有任何事情要做。

我想到的唯一解决方案是在肥皂使用中使用Parallel.ForEachlock

1 个答案:

答案 0 :(得分:0)

你可以尝试一些事情。

  • 对服务调用应用何种类型的身份验证。如果服务等对AD进行身份验证,则应确保仅对第一个呼叫进行身份验证,其余呼叫仅依赖于该呼叫。 AD身份验证可能需要相当长的时间(0.3 - 1.0 s)

  • 尝试安装Fiddler并将其用作WCF代理。 Fiddler将为您提供分解在服务呼叫执行的各个部分花费的时间的方法。

  • 您是否尝试ping过目标服务器 - ping时间是否可以接受?

  • 与以下调用相比,第一次调用花费了多少时间。第一次调用总是需要花费大量时间,因为CLR运行时必须生成动态XML代码的船载。仅生成XmlSerializer JIT代码是昂贵的,因为它动态生成C#代码,CSC编译器的踢,并加载生成的DLL。您可以查看一下SGEN工具,它可以在编译时生成XmlSerializer DLL而不是运行时(注意这只会对第一个执行时间有帮助)

在doSomething()的执行过程中,我无法看到实际花费多少时间在服务器端,因此很难看到实际花费了多少时间在网络上。有故障的网络硬件,电缆,交换机以及防火墙,路由表,SLA等可能会对您可以从中获得的性能产生负面影响。

正如已经提到的那样,拥有如此繁琐的接口,远远不是最佳的,服务所有者可能会遇到各种服务器端性能问题,如果这是他们暴露接口的正常方式 - 但是这是另一个故事:)