- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在用 Microsoft Dynamics CRM 做一些实验。您通过 Web 服务与它交互,并且我已向我的项目添加了一个 Web 引用。 web服务接口(interface)非常丰富,生成的“Reference.cs”有90k左右。
我在控制台应用程序中使用 Web 引用。我经常改变一些东西,重新编译并运行。编译速度很快,但更新 web 服务引用很慢,需要 15-20 秒:
分析显示所有时间都花在 SoapHttpClientProtocol 构造函数中。
CrmService service = new CrmService();
罪魁祸首显然是 XML 序列化代码(不包括在上面提到的 90k loc 中)是在运行时生成的,然后是 JIT。这发生在构造函数调用期间。在玩耍和尝试时,等待是相当令人沮丧的。
我尝试了 sgen.exe、ngen 和 XGenPlus 的各种组合(这需要几个小时并生成 500MB 的附加代码),但无济于事。我已经考虑过实现一个 Windows 服务,该服务几乎没有准备好在需要时提供的 CrmService 实例,但这似乎过度了。
有任何想法吗?
最佳答案
以下内容来自this VMWare 论坛上的主题:
嗨伙计,
我们发现 sgen.exe 确实有效。只是除了预先生成我们在此线程中遗漏的序列化程序 dll 之外,还有几个额外的步骤。这是详细的说明
问题
从 .NET 使用 VIM 2.0 SDK 需要很长时间来实例化 VimService 类。 (VimService类是运行'wsdl.exe vim.wsdl vimService.wsdl'生成的代理类)
换句话说,以下代码行:
_service = new VimService();
XmlSerializer
使用
System.Xml.Serialization.*
注释代理类以在运行时生成序列化代码的属性。当代理类很多并且很大时,如 VimService.cs 中的代码,序列化代码的生成可能需要很长时间。
VimService
的实例化时间缩短 20%。类(class)。跳过第 1 步或第 3 步会导致代码不正确。通过所有三个步骤,实现了 98% 的改进。
XmlSerializationAssemblyAttribute
仅在 .NET 2.0 版中可用
wsdl.exe vim.wsdl vimService.wsdl
csc /t:library /out:VimService.dll VimService.cs
sgen /p VimService.dll
System.Xml.Serialization.*
属性。由于代码量很大,最好的方法是使用一些正则表达式替换工具。执行此操作时要小心,因为并非所有属性都单独出现在一行中。有些是作为方法声明的一部分内联的。[System.Xml.Serialization.XmlIncludeAttribute
// [System.Xml.Serialization.XmlIncludeAttribute
Xml.Serialization
通过评论它们是导致放缓的最大罪魁祸首的属性。如果您使用的是其他 .NET 语言,只需根据该语言的语法将替换的字符串修改为前缀注释。这种简化的方法将使您获得最大的加速。删除其余的 Xml.Serialization 属性只能实现额外 0.2 秒的加速。 [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
csc /t:library /out:VimService.dll VimService.cs
SoapDocumentMethodAttribute
属性。目前还不清楚如何减少这个时间。预先生成的 XmlSerializer 程序集不考虑与 SOAP 相关的属性,因此这些属性需要保留在代码中。好消息是,只有该应用程序的 VimService 类的第一次实例化需要很长时间。因此,如果额外的 1.5 秒有问题,可以尝试在应用程序开始时对此类进行虚拟实例化,以改善用户登录时间的体验。
关于c# - 慢 SoapHttpClientProtocol 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/172095/
我只是对此感到好奇。我正在这个项目中进行更改,即使用 NetSuite Web 服务,有时它会随机抛出 SoapException,“一次只能针对一个 session 发出一个请求”。 pri
我通过 wsdl.exe 从 WSDL-URL 创建了一个 C# 代理类。我在我无法控制的 Web 应用程序的上下文中使用此代理类(因此无法更改 web.conf 或类似内容)。我也无法更改正在与之通
我使用 VS 2008 (c#) 的“添加 Web 引用”功能创建了一个 Web 服务代理。 生成的类派生自SoapHttpClientProtocol 我可以在单例中只存储一个代理实例吗?它是线程安
我有一个基于 SoapHttpClientProtocol 的 Web 服务引用 (.NET CF 3.5)。我的问题是——除了调用 web 方法之外,有没有办法确定是否建立了与 WebService
这几天我们的应用程序出现了问题。我们使用 SoapHttpClientProtocol 来调用 java mbean。这基本上是调用 java webservice 来调用方法。 我们的问题是有时会出
我正在用 Microsoft Dynamics CRM 做一些实验。您通过 Web 服务与它交互,并且我已向我的项目添加了一个 Web 引用。 web服务接口(interface)非常丰富,生成的“R
我需要告诉我的 C# soap Web 服务消费者不要验证证书而只接受它。这可能吗? 原因:我们发布了一个仅限 https 的网络服务。客户端需要使用它但有某种防火墙/代理(WebSense?),它对
当我为 Web 服务创建 Web 引用时,Visual Studio 神奇地创建了一个设置类,它允许我通过应用程序配置更改引用的 Web 服务 URL。对于在不重建代码的情况下在开发和生产服务器之间进
我可以自动转换从 WSDL 创建的 SoapHttpClientProtocol 类以使用 HTTPS 协议(protocol)而不是 HTTP 吗? (如果,如何?) 简单地将 web 服务的 UR
在我正在处理的 ASP.Net MVC 4 Web 应用程序中。我有一个页面基本上通过从 SOAP 服务获取数据来生成报告。 我的代码基本上是这样的 List serverInfos = Server
尽管在 Visual Studio 2005 中的客户端项目上启用了 WSE 3.0,但我所做的 Web 引用总是以从 SoapHttpClientProtocol 派生的服务代理结束。我必须手动将继
我正在从基于 C# 表单的应用中调用 Web 服务。 ServReturnType obj = ServProxyClass(int i, int k); 我有可能取回异常。异常可能是服务根本没有连接
我在 ASP.NET MVC4 中调用第三方 SOAP 服务(Magento 网上商店)。导入 Web 服务引用时,所有服务方法都由 Visual Studio 自动实现,例如登录 soap 方法实现
SO 上有很多关于此的帖子,我已经搜索过它们,但仍然没有解决方案。我希望有人能指出我正确的方向。 我们现在需要使用 TLS 1.2 连接到远程提供商。所以我安装了 Windows Server 201
无法从 C# 代码访问 https url。试图访问 https://blabla url并访问get方法。这是 SOAP 从 wsdl 生成的 c# 类。它可以从 SOAP UI 正常工作,但不能从
现在发现 SSL 3 容易受到 POODLE 的攻击攻击: System.Web.Services.Protocols.SoapHttpClientProtocol 在连接到任何 https Uri
现在发现 SSL 3 容易受到 POODLE 的攻击攻击: System.Web.Services.Protocols.SoapHttpClientProtocol 在连接到任何 https Uri
我正在使用动态实例化 SoapHttpClientProtocol 的代码对象(代理类)并使用该对象调用 WS-Basic I Web 服务。这是我的代码的简化版本: public override
我在 .NET 中有一个 SOAP Web 服务,它使用: System.Web.Services.Protocols.SoapHttpClientProtocol 如何获取通过 HTTP 发送的原始
我正在尝试从 C# 应用程序调用 Web 服务,但出现异常: InvalidOperationException client found response content type of 'text
我是一名优秀的程序员,十分优秀!