.NET Core对外部服务的请求缓慢

时间:2019-02-19 18:49:07

标签: c# performance wcf .net-core dotnet-httpclient

我有一个非常快的外部服务(在SoapUI测试中响应速度比50ms快)。

但是,当我在.NET Core应用程序中使用此服务时,在我的开发计算机上花费的时间超过500毫秒。 (并且在生产服务器中超过1秒)

我注意到Visual Studio仅为外部服务的方法生成“异步”方法。所以我在服务上有一个doSomething()方法,.NET将它映射到doSomethingAsync()

要调用此方法,只需在最后添加一个“ .Result”,因为我需要响应,并且不需要异步运行。

var result = client.doSomethingAsync().Result;

我这里有一个查看服务器的探查器(DynaTrace),它正在显示对SendAsync()方法的调用,以调用外部服务URL。我在应用程序上没有使用任何SendAsync()。我的代码中甚至没有任何HttpClient类实例!

DynaTrace profiler SendAsync call

我猜想.NET正在以某种方式将我的同步调用封装在一个异步调用中,然后仅等待响应以恢复代码执行...而且我猜想它正在为许多本应简单而又快速的事情创建大量的开销处理

所以问题是:如何在.NET Core中更快地调用外部服务方法?

下面是代码的相关部分:

EndpointAddress address = new EndpointAddress(baseExternalAccess.UrlService);
BasicHttpBinding binding = new BasicHttpBinding();
binding.MaxReceivedMessageSize = 2147483647;
binding.OpenTimeout = new TimeSpan(1, 0, 0);
binding.SendTimeout = new TimeSpan(1, 0, 0);
binding.Security.Mode = BasicHttpSecurityMode.Transport;
Stopwatch stopwatch = new Stopwatch();
using (MyServiceSoapClient cliente = new MyServiceSoapClient(binding,address))
{
    stopwatch.Reset();
    stopwatch.Start(); 
    var result = cliente.doSomethingAsync().Result;
    stopwatch.Stop();
    logger.Information("Time: " + stopwatch.ElapsedMilliseconds.ToString() + "ms");
}

编辑:为了澄清问题,我从头开始创建了两个新项目。一个使用.NET Core,另一个使用.NET Framework。

.NET Core

  1. 右键单击项目
  2. 添加->连接的服务
  3. 选择“ Microsoft WCF Web服务参考提供程序”
  4. 通知服务wsdl URI,单击GO
  5. 通知名称空间,单击“下一步”
  6. 不做任何更改,单击“完成”
  7. 等待Visual Studio发现服务并创建它。

.NET Framework

  1. 右键单击“参考”->“添加服务参考” ...
  2. 在“地址”框中,通知服务wsdl url,单击“执行”。
  3. 通知名称空间,单击“高级”
  4. 取消选中“允许异步操作生成”,然后单击“确定”。
  5. 单击确定,等待VS创建它。

然后,在两个项目中,我都使用相同的参数对相同的方法进行了简单的调用。实际上,代码几乎相同,唯一的区别是在.NET Core版本上,方法名称为“ doSomethingAsync()”,而在.NET中,我必须在方法名称后使用“ .Result”框架版本,方法名称是“ doSomething()”,我可以直接调用它。

修改2: 每次运行此测试时,我都会得到类似的结果...在.NET Framework版本上,对service方法的首次调用始终快约700ms。接下来的9个调用具有类似的计时(但是.NET Framework总是稍快一些)。

在我的程序中,我只需要调用一次服务,因此只有第一次调用的时间对我很重要。

修改3: 好的,.NET Core似乎有一些访问Web服务的开销延迟。

我制作了四个版本的C#控制台应用程序,该版本仅向此外部服务发出10个请求,并使用秒表测量时间:

  • .NET Framework 2.0(使用Web参考)
  • .NET Framework 4.6.1(使用WCF服务参考)
  • .NET Core 2.1(使用WCF Web服务参考)
  • .NET Core 2.2(使用WCF Web服务参考)

以下是结果:

Test .NET Framework 2.0 Web Reference
Time: 1502ms
Time: 762ms
Time: 693ms
Time: 728ms
Time: 763ms
Time: 644ms
Time: 845ms
Time: 688ms
Time: 667ms
Time: 676ms
Total time: 7993ms

Test .NET Framework 4.6.1 WCF Reference
Time: 1770ms
Time: 675ms
Time: 619ms
Time: 644ms
Time: 895ms
Time: 671ms
Time: 611ms
Time: 702ms
Time: 655ms
Time: 741ms
Total time: 8251ms

Test .NET Core 2.1 WCF Reference
Time: 2984ms
Time: 759ms
Time: 899ms
Time: 874ms
Time: 756ms
Time: 792ms
Time: 922ms
Time: 1001ms
Time: 767ms
Time: 679ms
Total time: 10810ms

Test .NET Core 2.2 WCF Reference
Time: 3167ms
Time: 796ms
Time: 707ms
Time: 732ms
Time: 929ms
Time: 828ms
Time: 775ms
Time: 847ms
Time: 957ms
Time: 884ms
Total time: 10877ms

结果显示,最大的问题是第一个请求。它比其他9个请求花费的时间更长,并且最后9个请求在所有te测试中的计时时间都相似(但是.NET Core的测试时间仍然稍慢)。

我的应用程序仅向Web服务发出一个请求,因此只有第一个呼叫时间对我很重要。

所以我的结论是,使用WCF Web服务时.NET Core速度很慢。

0 个答案:

没有答案