Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF XmlSerializer程序集未加速第一个请求_C#_Wcf_Xml Serialization_Svcutil.exe - Fatal编程技术网

C# WCF XmlSerializer程序集未加速第一个请求

C# WCF XmlSerializer程序集未加速第一个请求,c#,wcf,xml-serialization,svcutil.exe,C#,Wcf,Xml Serialization,Svcutil.exe,我正在使用svcutil为客户端java webservice wsdls和xsd文件生成代理类。第一次调用每个服务代理类需要很长时间。我希望通过自己生成XmlSerializers程序集(基于本文)来加快速度,但是当我第一次调用每个服务时,仍然需要相同的时间。以下是我将遵循的步骤: //generate strong name key file sn -k Blah.snk //generate the proxy class file svcutil blah.wsdl blah2.wsd

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

//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();
//BlahProxy是生成的服务代理类之一
BlahProxy p=新BlahProxy();
//这个电话需要30秒
p、 somethod();
BlahProxy p2=新BlahProxy();
//此通话时间<1秒
p2.SomeMethod();
//BlahProx2y是生成的服务代理类之一
BlahProxy2 p3=新BlahProxy2();
//这个电话需要30秒
p3.SomeMethod();
BlahProxy2 p4=新BlahProxy2();
//此通话时间<1秒
p4.SomeMethod();

我知道问题不在服务器端,因为我直到29秒左右才看到在Fiddler中发出的请求。对每个服务的后续调用需要<1秒,因此我希望主要的慢动作是.net运行时本身生成xmlserializer代码,编译并加载程序集。我想这就是为什么每个服务的第一个调用都很慢,而其他调用都很快的原因。不幸的是,我自己生成代码并没有加快任何速度。有人知道我做错了什么吗?

您的服务公开了哪种端点?有时延迟是由于安全握手造成的。另外,我可以建议您使用net.tcp协议,如果它能够响应您的应用程序要求,那么它比其他协议更快

我还可以建议您从一些作业开始服务,因为它总是会延迟对代理的第一次调用,并且下面的调用(即使是其他用户)会更快


告诉我这是否有帮助。

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

如果您知道要对代理进行连续调用(并且您不担心会话问题),那么您应该尽早创建代理并调用Open。一旦这样做,您应该根据需要调用代理,并且只在完成后进行处置


董文龙,他对如何优化代理性能提出了更多建议。

我无法控制服务本身。我曾考虑过在我的应用程序池启动时创建服务代理类的实例(以避免对服务的第一次“真正”调用出现延迟),但我希望通过正确生成XmlSerializer代码来避免这种情况,或者至少找出我的XmlSerializer程序集目前没有帮助的原因。我正在使用xaml序列化程序,我没有任何抱怨。。。第一次呼叫延迟我2-4秒,但我有安全对话。。。所以我真的不知道为什么你的客户端这么慢。为了体验,尝试创建您的服务,并使用相同的客户端和相同的序列化程序使用它。。。请参阅what's happends…+1篇很棒的文章,因此他所说的对我上面的示例来说是有意义的,并且3.5中appdomain级别的通道工厂缓存(尽管27秒对于“管道”来说似乎是一个疯狂的时间量)。因此,我想我唯一的选择可能是打开每个代理的一个实例(当我的应用程序池启动时),将它们的通道工厂加载到应用程序域中。我同意您的观点,问题一定不是XmlSerialization,因为如果我“禁用”通道工厂缓存,正如本文所解释的,第二次调用也需要27秒,我假设它们都使用相同的XmlSerializer代码。我想知道“羽状”所花费的时间是否是这些代理类文件大小的结果。客户端的wsdl和xsd非常庞大,因为它们保存了每个方法和对象的历史记录(MethodA_1、MethodA_2、…MethodA_12、MethodAInput_1、MethodAInput_2等)。这使得svcutil生成的文件>11MB。@Matt Dearing:是的,我不得不说通道生成(因为端点描述等都必须设置)肯定是这里的问题。对于一个11MB的WSDL文件,这简直太疯狂了,而WCF要在一个代理上实现所有这些,需要做大量的工作。很遗憾,您无法控制服务,否则,我建议将其分为不同的服务。不,我的意思是svcutil生成的1文件是11MB。有许多单独的wsdl和单独的xsd文件,但我所看到的共享数据类型的唯一方法是在svcutil调用中生成所有代理代码。如果我分别调用svcutil,它们每个都会得到自己的所有数据类型的副本,这会给我十三个6MB的文件(每个服务一个),而不是一个11MB的文件。事实上,我在这里列出了一个问题:,如果你愿意加入,因为没有其他人加入=)。