24

我在一个 IIS 应用程序中运行了一堆 .NET Web 服务。这些 Web 服务由另一个 IIS 应用程序(前端)使用。第一次通话很慢,大约 5 到 10 秒。在那之后它只是几毫秒。第一次调用被认为是性能问题。

我们已经尝试过调用所有这些 web 服务的应用程序,但这显然不能解决任何问题。所以问题不是默认的应用程序回收。我创建了一个应用程序,它只是多次初始化服务并测量创建一个实例所需的时间。在运行此应用程序之前,我确保我的 web 服务应用程序已启动/回收,然后我运行该应用程序。第一次初始化需要 2 到 4 秒,其他的只是毫秒。

另一个想法是我们在前端应用程序中创建一个页面来启动所有 Web 服务,并且我们在任何用户进入之前调用这个页面。我不认为这是一个优雅的解决方案,我还能尝试什么?

4

7 回答 7

37

客户端第一次调用 Web 服务时遇到的延迟是由于默认情况下需要编译 Web 服务的 XmlSerializers dll 造成的。这导致初始呼叫需要 2-4 秒。当然,当 web 服务应用程序已经在运行时,就会出现这种情况,如果不是,您将进行回收。在这种情况下,其他答案可能会有所帮助。

为了加快初始调用,您可以在编译时创建 XmlSerializers dll。您可以通过将项目构建“生成序列化程序集”设置为打开来完成此操作。这会生成一个包含 Web 服务信息的 MyApplication.XmlSerializers.dll。现在初始调用下降到 300 毫秒,大概是 dll 的加载。之后的所有呼叫都需要 0 毫秒。

在 Visual Studio 中,右键单击您的项目并选择“属性”。转到“构建”选项卡。在“输出”部分,您可以选择“生成序列化程序集”。如果将值更改为“On”,则将在编译期间生成序列化程序集。

于 2009-04-24T21:18:11.130 回答
10

第一次调用 web 服务,或者长时间延迟后的第一次,需要启动 web 服务。这是您看到延迟的地方。在那之后,它已经开始并且会非常快速地响应呼叫。这是标准的 Web 服务行为。

您可以将 IIS 配置为 keepalive = true - 这可能会提高性能。

根据要求提供更多信息。

可能是在运行时创建序列化程序集。您可以使用项目属性窗口的 Build 窗格底部的下拉菜单更改序列化程序集的设置。

可能是您编写了 Web 服务以在应用程序启动时执行大量操作,这将在第一次调用服务上的方法时发生。

可能是操作非常慢,但是您正在缓存响应,这使得后续调用更快。

于 2009-04-24T08:18:08.117 回答
5

我最近发现在我们的 ASMX 文件中我们只提到了类名。我们在每个 ASMX 文件的不同程序集中获得了服务实现。这会导致 .NET 框架扫描整个 bin 文件夹以查找包含实现的程序集。随着您的 Web 服务应用程序的增长,这将消耗更多时间。这不仅可以通过在您的 ASMX 定义中包含类名而且还包括程序集名称来解决。

我们的 ASMX 看起来像这样:

<%@ WebService Language=”C#” CodeBehind=”MyService.cs” Class=”MyWebservice” %>

如果您将其更改为包含包含实现的程序集,它将如下所示。这为我们节省了大约 10% 的 Web 服务应用程序初始负载。

<%@ WebService Language=”C#” CodeBehind=”MyService.cs” Class=”MyWebservice, MyWebservice.Implementation.Assembly” %>

于 2009-08-13T16:58:20.890 回答
4

这是典型的,因为 ASP.NET 应用程序会在第一次请求时编译 bin\ 目录并将其加载到内存中。

首先要做的事情:

删除 bin 目录中所有不必要的 dll。(我见过人们发布 nunit.dll)

预编译您的 ASP.NET 应用程序,以便 IIS 不需要。请参阅“ VS 2008 Web 部署项目支持发布

于 2009-04-24T08:19:21.640 回答
2

不确定这是否会解决“第一次”时 WS 的缓慢启动问题,因为我假设有大量编译和 .net DLL 正在加载,但您几乎可以通过确保应用程序池来消除任何未来的冷启动WS 所在的配置正确。

默认情况下,IIS6 在空闲时“重生”,经过几分钟或“回收”事件,每次都有效地重新启动 WS。如果您对服务稳定感到满意,则不需要这些。

强烈建议确保 WS 拥有自己的专用应用程序池(不共享不合适的池)。

于 2009-04-24T08:20:46.037 回答
1

经过几个小时的疯狂测试,我已经能够将同一 IP 类中的两个主机(低于 300 毫秒)的 Web 服务首次运行执行时间减少到最低限度。

起初,我在第一次 web 服务调用时经历了 2-3 秒的初始延迟,比来自同一进程的任何后续调用都非常快。

在我的案例中理解延迟的关键是客户端如何处理 WEB PROXY !

这是我在 app.config 文件中的新绑定:

  <basicHttpBinding>
    <binding name="CreateContextSoap" closeTimeout="00:01:00" openTimeout="00:01:00"
        receiveTimeout="01:00:00" sendTimeout="01:00:00" allowCookies="false"
        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
        maxBufferSize="16777216" maxBufferPoolSize="524288" maxReceivedMessageSize="16777216"
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
        useDefaultWebProxy="false">
      <readerQuotas maxDepth="32" maxStringContentLength="1048576" maxArrayLength="16384"
          maxBytesPerRead="65536" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
            realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>

我想第一次网络调用执行要慢得多,因为传输通道需要在初始化时发现代理配置,以便透明地连接到互联网。这通常不需要进入 Intranet 环境,因此我更改了这些绑定设置以避免使用默认代理(从资源管理器设置中自动发现):

bypassProxyOnLocal="假"

使用DefaultWebProxy="假"

首次呼叫连接时间现在大大减少。希望这可以帮助。

于 2013-08-28T14:48:02.313 回答
0

抱歉添加了死灵,但这对我来说也是一场持续的斗争,我想在图片中添加一些信息。VisualStudio 本身为时间添加了一个相当大的组件。这是基本测试,涉及一个基本的表单应用程序和一个在公司服务器内部托管的已经运行的 Web 服务(所有测试的 Generate Serialization Assembly 设置为 true):

Running in VS, Debug:
    First Call: 400 ms to set up client object, 450 to call function
    Second Call: 1 ms to set up client object, 14 to call function
Running as .exe, Release:
    First Call: 20 ms to set up client object, 70 to call function
    Second call: 1 ms to set up client object, 4 to call function
Running the Debug's .exe file outside of vs:
    First Call: 20 ms to set up client object, 80 to call function
    Second call: 1 ms to set up client object, 4 to call function
Running as Release within VS:
    Similar results to Debug in VS -- very slow

短篇故事?Visual Studio 正在为图片添加大量时间。而不是约 90 毫秒,它需要将近一秒钟。因此,如果您正在进行性能调整,请确保在 VisualStudio 环境之外进行测试。

于 2017-12-06T15:31:03.100 回答