【问题标题】:Speed up SOAP request in c#在 C# 中加速 SOAP 请求
【发布时间】:2013-12-21 03:33:43
【问题描述】:

我有一段这样的代码:

  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 响应之前我无事可做。

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

【问题讨论】:

  • 如果您必须发出 1000 个请求,那么您必须发出 1000 个请求……也许您可以为您正在调用的 SOAP API 寻找一个更好的模型 - 是否在您的控制之下?你能创建多个soapClient 的实例吗?
  • @DanPuzey 不,API 不在我的控制之下,我不能使用更多的 soapClient 实例,因为检查多个请求是明智的(我正在使用 API 密钥)。我现在正在使用带锁的Parallel For,它的速度稍微快一些。我认为这是最好的解决方案:(
  • 你知道这台服务器是否使用 HTTP 1.1?...默认使用持久连接。否则,如果是 HTTP 1.0,您可以请求保持连接打开(保持活动状态),这样您就不必为每个请求继续进行 TCP 握手。您需要查看网络上的流量(使用 WireShark/Fiddler)...stackoverflow.com/questions/4699013/… ...另外,您如何生成“代理”(添加服务参考,或添加 Web 参考?).. .是WCF吗? (也许你正在达到一些限制)
  • 您还可以增加对该主机的“连接”限制....blogs.msdn.com/b/jpsanders/archive/2009/05/20/…
  • 你无法加快速度。您可以请求所有者添加处理批量数据的方法,您想在此处执行此操作。只进行一次调用并给它一个 e 列表并返回一个结果列表会更好。

标签: c# multithreading soap asynchronous async-await


【解决方案1】:

您可以尝试一些事情。

  • 对服务调用应用什么类型的身份验证。如果服务等针对 AD 进行身份验证,则应确保仅对第一个调用进行身份验证,而其余调用只是附带在该调用上。 AD 身份验证可能需要大量时间(0.3 - 1.0 秒)

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

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

  • 与以下调用相比,第一次调用花费了多少时间。第一次调用总是会花费大量时间,因为 CLR 运行时必须生成大量动态 XML 代码。仅生成 XmlSerializer JIT 代码的成本很高,因为它会动态生成 C# 代码、启动 CSC 编译器并加载生成的 DLL。您可能会看一下 SGEN 工具,它可以在编译时而不是运行时生成 XmlSerializer DLL(请注意,这仅有助于第一次执行时间)

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

当然,正如已经提到的那样,拥有这样一个您必须使用的健谈界面远非最佳,如果这是他们公开界面的正常方式,服务所有者可能会遇到各种服务器端性能问题 - 但是那是另一个故事:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多