我正在使用 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.dll
和Blah.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 代码本身,编译它并加载程序集。我认为这将是对每个服务的第一次调用很慢而其余调用很快的原因。不幸的是,我自己生成代码并没有加快速度。有谁看到我做错了什么?