我正在用svcutil爲客戶機java webservice wsdls和xsd文件生成代理類。對每個服務代理類的第一次調用需要很長時間。我希望通過自己生成XmlSerializers程序集(基於文章How to: Improve the Startup Time of WCF Client Applications using the XmlSerializer)來加快速度,但是當我第一次調用每個服務時仍然需要相同的時間。下面是我下面的步驟:WCF XmlSerializer程序集沒有加速第一個請求
//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秒請求。隨後每個服務的調用都需要1秒鐘,因此我希望主要的減速是.net運行時生成xmlserializer代碼本身,編譯它並加載程序集。我想這將是第一次打電話給每個服務的原因,其餘的都很快。 Unfortunatley,我自己生成代碼並沒有加速。有沒有人看到我在做什麼錯了?
+1大文章,所以他說的是有道理的我的例子上面,和頻道工廠緩存在3.5的appdomain級別(雖然27秒似乎是一個瘋狂的時間「管道」)。所以我想我唯一的選擇可能是打開每個代理的實例(當我的應用程序池啓動時)將其渠道工廠加載到應用程序域中。我同意你的問題不能是XmlSerialization,因爲如文中所解釋的,如果我「禁用」通道工廠緩存,第二次調用也需要27秒,我假設它們都使用相同的XmlSerializer代碼。 – 2010-05-12 16:19:36
我想知道「pluming」所用的時間量是否是這些代理類文件大小的結果。客戶端的wsdls和xsds是巨大的,因爲它們保留了每個方法和對象的歷史記錄(MethodA_1,MethodA_2,... MethodA_12,MethodAInput_1,MethodAInput_2等)。這使得svcutil生成的文件> 11MB。 – 2010-05-12 16:23:07
@Matt Dearing:是的,我必須說,頻道的生成(因爲終端描述等都必須設置)絕對是這裏的問題。對於一個11MB的WSDL文件,這只是一個瘋狂的事情,而WCF爲使所有這些代理都可用而做的工作量是巨大的。你無法控制服務是一種恥辱,否則,我建議把它分解成單獨的服務。 – casperOne 2010-05-12 16:35:48