慢速 SoapHttpClientProtocol 构造函数

2024-02-13

我正在使用 Microsoft Dynamics CRM 进行一些实验。您通过 Web 服务与它交互,我已将 Web 引用添加到我的项目中。 Web服务接口非常丰富,生成的“Reference.cs”有90k左右。

我在控制台应用程序中使用网络参考。我经常改变一些东西,重新编译并运行。编译很快,但更新 Web 服务引用非常慢,需要大约 15-20 秒: CrmService service = new CrmService(); 分析显示所有时间都花费在 SoapHttpClientProtocol 构造函数中。

罪魁祸首显然是 XML 序列化代码(不包括在上面提到的 90k loc 中)是在运行时生成的,然后进行 JIT 编译。这发生在构造函数调用期间。当玩耍和尝试时,等待是相当令人沮丧的。

我尝试了 sgen.exe、ngen 和 XGenPlus 的各种组合(这需要几个小时并生成 500MB 的额外代码),但没有效果。我考虑过实现一个 Windows 服务,该服务几乎没有 CrmService 实例可以在需要时提供,但这似乎过多。

有任何想法吗?


以下内容摘自this http://communities.vmware.com/thread/47063VMWare 论坛上的帖子:

嗨伙计,

我们发现 sgen.exe 确实有效。只是除了预生成序列化器 dll 之外,我们在本线程中还漏掉了一些额外的步骤。这是详细说明

PROBLEM

当使用 .NET 中的 VIM 2.0 SDK 时,需要很长时间来实例化 VimService 类。 (VimService类是运行'wsdl.exe vim.wsdl vimService.wsdl'生成的代理类)

换句话说,下面这行代码:

_service = new VimService();

执行可能需要大约 50 秒。

CAUSE

显然,.NETXmlSerializer使用System.Xml.Serialization.*注释代理类的属性以在运行时生成序列化代码。当代理类又多又大时,就像 VimService.cs 中的代码一样,序列化代码的生成可能需要很长时间。

SOLUTION

这是 Microsoft .NET 序列化程序工作方式的一个已知问题。

以下是 MSDN 提供的一些有关解决此问题的参考资料:

http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx http://msdn2.microsoft.com/en-us/library/system.xml.serialization.xmlserializer assemblyattribute.aspx http://msdn2.microsoft.com/en-us/library/system.xml.serialization.xmlserializerassemblyattribute.aspx

不幸的是,上述参考文献都没有描述该问题的完整解决方案。相反,他们关注如何预先生成 XML 序列化代码。

完整的修复涉及以下步骤:

  1. 使用预先生成的 XML 序列化程序代码创建程序集(DLL)

  2. 从代理代码(即从 VimService.cs 文件)中删除对 System.Xml.Serialization.* 属性的所有引用

  3. 使用 XmlSerializerAssemblyAttribute 注释主代理类,以将其指向 XML 序列化程序集所在的位置。

跳过第 2 步只会导致实例化时间缩短 20%VimService班级。跳过步骤 1 或 3 会导致代码错误。通过所有这三个步骤,实现了 98% 的改进。

以下是分步说明:

在开始之前,请确保您使用的是 .NET 2.0 版工具。此解决方案不适用于 .NET 1.1 版本,因为 sgen 工具和XmlSerializationAssemblyAttribute仅在 .NET 2.0 版本中可用

  1. 使用 wsdl.exe 从 WSDL 生成 VimService.cs 文件:

    wsdl.exe vim.wsdl vimService.wsdl

    这将输出当前目录中的VimService.cs文件

  2. 将 VimService.cs 编译成库

    csc /t:library /out:VimService.dll VimService.cs

  3. 使用 sgen 工具预生成并编译 XML 序列化器:

    sgen /p VimService.dll

    这将输出当前目录中的VimService.XmlSerializers.dll

  4. 返回VimService.cs文件并删除所有System.Xml.Serialization.*属性。由于代码量较大,实现这一点的最佳方法是使用一些正则表达式替换工具。执行此操作时要小心,因为并非所有属性都单独出现在一行上。有些是作为方法声明的一部分内联的。

    如果您发现这一步很困难,这里有一个简化的方法:

    假设您正在编写 C#,请对以下字符串进行全局替换:

    [System.Xml.Serialization.XmlIncludeAttribute

    并将其替换为:

    // [System.Xml.Serialization.XmlIncludeAttribute

    这将摆脱Xml.Serialization通过注释掉是造成速度放缓的最大罪魁祸首的属性。如果您使用其他 .NET 语言,只需根据该语言的语法修改要添加前缀注释的替换字符串即可。这种简化的方法将为您带来最大的加速效果。删除其余的 Xml.Serialization 属性只能实现额外的 0.2 秒加速。

  5. 在 VimService.cs 中的 VimService 类中添加以下属性:

    [System.Xml.Serialization.XmlSerializerAssemblyAttribute(AssemblyName = "VimService.XmlSerializers")]

    你最终应该得到这样的结果:

    // ... Some code here ... [System.Xml.Serialization.XmlSerializerAssemblyAttribute(AssemblyName = "VimService.XmlSerializers")] public partial class VimService : System.Web.Services.Protocols.SoapHttpClientProtocol { // ... More code here

  6. 重新生成 VimSerice.dll 库

    csc /t:library /out:VimService.dll VimService.cs

  7. 现在,您可以从您的应用程序添加对 VimSerice.dll 库的引用。

  8. 运行您的应用程序并验证 VimService 对象实例化时间是否减少。

补充笔记

sgen 工具有点像黑匣子,其行为根据 Machine.config 文件中的内容而有所不同。例如,默认情况下它应该输出优化的非调试代码,但情况并非总是如此。要获得对该工具的一些可见性,请在步骤 3 中使用 /k 标志,这将导致它保留所有临时生成的文件,包括它生成的源文件和命令行选项文件。

即使经过上述修复,第一次实例化 VimService 类所需的时间也不是瞬时的(1.5 秒)。根据经验观察,剩余时间的大部分似乎是由于处理SoapDocumentMethodAttribute属性。目前还不清楚如何减少这个时间。预生成的 XmlSerializer 程序集不考虑 SOAP 相关属性,因此这些属性需要保留在代码中。好消息是,只有该应用程序的 VimService 类的第一次实例化需要很长时间。因此,如果额外的 1.5 秒是一个问题,可以尝试在应用程序开始时对此类进行虚拟实例化,作为改善用户登录时间体验的一种方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

慢速 SoapHttpClientProtocol 构造函数 的相关文章

  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 在通过网络发送之前压缩位图

    我正在尝试通过网络发送位图屏幕截图 因此我需要在发送之前对其进行压缩 有一个库或方法可以做到这一点吗 当您将图像保存到流时 您have选择一种格式 几乎所有位图格式 bmp gif jpg png 都使用一种或多种压缩形式 因此 只需选择适
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 如何将字符串转换为 Indian Money 格式?

    我正在尝试将字符串转换为印度货币格式 例如如果输入为 1234567 则输出应为 12 34 567 我编写了以下代码 但它没有给出预期的输出 CultureInfo hindi new CultureInfo hi IN string t
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 我应该如何在 VB.NET 中进行转换?

    所有这些都相等吗 在什么情况下我应该选择其中一个而不是其他 var ToString CStr 变量 CType 变量 字符串 DirectCast 变量 字符串 编辑 来自的建议不是我自己 https stackoverflow com
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D

随机推荐

  • 有没有办法在Windows中模拟LD_LIBRARY_PATH?

    我有一个程序可以做一些图形 当我以交互方式运行它时 我希望它使用系统中的 OpenGL 来提供硬件加速图形 当我批量运行它时 我希望能够将其重定向以使用 Mesa GL 库 以便我可以使用 OSMesa 功能渲染到屏幕外缓冲区 如果选择了批
  • 如何在 VBA 2010 上导出图像之前裁剪图像

    我有一个子例程可以很好地导出从 Excel 中的某个范围内获取的图像 但我遇到了一个问题 即使我设法使图表对象透明并且没有边框 导出的图像有一个我希望在导出之前裁剪很多未使用的区域 Sub BtnSaveFile Click Dim RgE
  • 努力在 Glassfish 上创建 MySQL 连接池

    我以前已经这样做过 但由于某种原因 我在创建这个连接池时确实遇到了一些困难 当我在创建连接池后 ping 连接池时 出现以下错误 Ping Connection Pool for bondsaver is Failed Ping faile
  • 远程连接 Neo4j 服务器

    我相信创建远程连接的方法是更改 此行conf neo4j server properties 特别是删除注释并重新启动服务器 org neo4j server webserver address 0 0 0 0 我的网址是https 0 0
  • 启动 Nexus docker 镜像时如何设置管理员用户/密码

    当在 Nexus 2 docker 镜像中启动时 https hub docker com r sonatype nexus https hub docker com r sonatype nexus 如何配置它以将默认管理员用户密码更改为
  • 在 Clojure 中搜索 xml

    我有以下示例 xml
  • 有没有办法在 Protractor 测试中绕过 Chrome 地理定位对话框?

    在使用量角器自动化应用程序时 我遇到了这个问题 打开主页后 我会看到带有 阻止 允许 按钮的地理位置对话框 如果不选择任一选项 该对话框就无法继续 事实证明 这个对话框不是警报的实例 这就是为什么browser switchTo alert
  • 新 Activity 的 onStart 在父 Activity 的 onStop 之前调用

    我有一份申请 我用startActivity 开始活动 谁能真正告诉我为什么系统会调用onStart 首先是新 Activity 而不是父活动onStop 这可能吗 没有系统错误 我找到了在 onStart 之后直接调用 Fragment
  • 从文件生成频率表

    给定一个每行包含一个数字的输入文件 我如何计算某个项目在该文件中出现的次数 cat input txt 1 2 1 3 1 0 期望的输出 gt 1 3 1 1 cat output txt 0 1 1 3 2 1 3 1 如果该解决方案也
  • Postgres SELECT 数组中的值

    我有一个看起来像这样的 postgres 表 缩短 id serial col1 character varying 1 Life Health VA Data 我正在尝试执行以下操作 SELECT FROM mytable WHERE L
  • 析构函数的执行顺序?

    我知道c 中的析构函数没有执行顺序 我在几个类中使用以下结构 它是为了破坏实例和静态信息 public class MyClass private static readonly Destructor DestructorObject ne
  • =importXML() 中的 xpath 用于提取元描述

    我正在尝试使用 Xpath 使用 Google Sheets 从网页中提取元描述 我正在努力提取标题 importXml www example com title 以下是我的两个学习来源 http seogadget co uk play
  • 简单 MySQL 子查询性能

    考虑 2 个 MySQL 查询 SELECT ue userid e courseid FROM SELECT id courseid FROM mdl enrol WHERE status 0 AND courseid IN 46 e I
  • 使用 ADO .NET 调用 SQL 函数

    我想要在 SQL Server 中创建调用函数 它接收两个参数并返回一个整数 当我调用存储过程时 我使用以下代码 sqlcmd CommandType CommandType StoredProcedure sqlcmd CommandTe
  • C 或 C++ 中乘法和除法的较高部分?

    当我在汇编中将一对 4 字节整数相乘时 结果的较低部分在 EAX 中 较高部分在 EDX 中 如果我使用 C 或 C 并且我想获得更高的部分 是否可以不使用内联汇编 是否可以以同样的方式从 EAX 获得整数除法结果 从 EDX 获得模数结果
  • Android NDK - 附加包含目录

    我正在使用 Android NDK 构建共享库 我包含了 Android mk 文件中的一个片段 该片段给我带来了一些问题 LOCAL PATH call my dir other module here other module here
  • 在 React Native 中使用 React Navigation 隐藏 StackNavigator 上的标头

    我有以下内容 import React from react import StyleSheet Text View Button from react native import StackNavigator from react nav
  • 专门化模板类的模板成员函数?

    我有一个模板类 它有一个需要专门化的模板成员函数 如下所示 template
  • C#:获取从表单发布的值[重复]

    这个问题在这里已经有答案了 我使用带有方法 post 的表单从另一个页面发布一些数据 我想知道的是 获取这些值的最佳方法是什么 按以下形式的每个名称 Request name 或者有什么方法可以获取数据集合并迭代它 谢谢 你可以写 fore
  • 慢速 SoapHttpClientProtocol 构造函数

    我正在使用 Microsoft Dynamics CRM 进行一些实验 您通过 Web 服务与它交互 我已将 Web 引用添加到我的项目中 Web服务接口非常丰富 生成的 Reference cs 有90k左右 我在控制台应用程序中使用网络