3

我正在使用 svcutil 为客户端 java webservice wsdls 和 xsd 文件生成代理类。对每个服务代理类的第一次调用需要很长时间。我希望通过自己生成 XmlSerializers 程序集来加快速度(基于文章如何:使用 XmlSerializer 改进 WCF 客户端应用程序的启动时间),但是当我第一次调用每个服务时仍然需要相同数量的时间。以下是我正在遵循的步骤:

//generate strong name key file
sn -k Blah.snk

//generate the proxy class file
svcutil blah.wsdl blah2.wsdl blah3.wsdl ... base.xsd blah.xsd ... /UseSerializerForFaults /ser:XmlSerializer /n:*,SomeNamespace /out:Blah.cs

//compile the class into an assembly signing it with the strong name key file
csc /target:library /keyfile:Blah.snk /out:Blah.dll Blah.cs

//generate the XmlSerializer code this will give us Blah.XmlSerializers.dll.cs
svcutil /t:xmlSerializer Blah.dll

//compile the xmlserializer code into its own dll using the same key to sign it and referencing the original dll
csc /target:library /keyfile:Blah.snk /out:Blah.XmlSerializers.dll Blah.XmlSerializers.dll.cs /r:Blah.dll

然后,我创建了一个标准的控制台应用程序,它同时引用了Blah.dllBlah.XmlSerializers.dll. 然后我会尝试类似的东西:

//BlahProxy is one of the generated service proxy classes
BlahProxy p = new BlahProxy();
//this call takes 30ish seconds
p.SomeMethod();

BlahProxy p2 = new BlahProxy();
//this call takes < 1 second
p2.SomeMethod();

//BlahProx2y is one of the generated service proxy classes
BlahProxy2 p3 = new BlahProxy2();
//this call takes 30ish seconds
p3.SomeMethod();

BlahProxy2 p4 = new BlahProxy2();
//this call takes < 1 second
p4.SomeMethod();

我知道问题不在于服务器端,因为直到大约 29 秒我才看到 Fiddler 发出的请求。对每个服务的后续调用需要 < 1 秒,这就是为什么我希望主要的减速是 .net 运行时生成 xmlserializer 代码本身,编译它并加载程序集。我认为这将是对每个服务的第一次调用很慢而其余调用很快的原因。不幸的是,我自己生成代码并没有加快速度。有谁看到我做错了什么?

4

2 回答 2

2

我相信问题不在于 XML 序列化,而在于对代理的第一次调用。第一次调用代理总是需要很长时间,因为 WCF 必须设置大量的管道。

如果您知道您将在代理上进行连续调用(并且您不必担心会话问题),那么您应该尽早创建代理并在其上调用 Open。一旦你这样做了,你应该在你需要的时候调用代理,并且只在完成后处理。

Wenlong Dong详细阐述了围绕代理创建的最佳实践,其中有更多关于如何优化代理性能的建议。

于 2010-05-12T15:51:44.733 回答
1

你的服务暴露了什么样的端点?有时由于安全握手而发生延迟。另外我可以建议您使用 net.tcp 协议,如果它响应您的应用程序要求,它比其他协议更快。

我还可以建议您通过一些工作来启动您的服务,因为它总是会延迟第一次调用代理,并且后续调用(即使是其他用户)会更快。

告诉我这是否有帮助。

于 2010-05-12T14:39:16.673 回答