2010-05-12 59 views
2

我正在用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.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秒請求。隨後每個服務的調用都需要1秒鐘,因此我希望主要的減速是.net運行時生成xmlserializer代碼本身,編譯它並加載程序集。我想這將是第一次打電話給每個服務的原因,其餘的都很快。 Unfortunatley,我自己生成代碼並沒有加速。有沒有人看到我在做什麼錯了?

回答

2

我認爲問題不在於XML序列化,而在於首次調用代理。第一次打電話給代理是總是需要很長時間,因爲WCF必須建立一個很好的管道。

如果您知道您將要對代理進行連續調用(並且您沒有會話問題擔憂),那麼您應儘早創建代理並對其打電話打開。一旦你這樣做,你應該打電話給代理,因爲你需要他們,只有完成後處置。

文龍東elaborates on best practices revolving around proxy creation,對於如何優化代理性能提出了更多建議。

+0

+1大文章,所以他說的是有道理的我的例子上面,和頻道工廠緩存在3.5的appdomain級別(雖然27秒似乎是一個瘋狂的時間「管道」)。所以我想我唯一的選擇可能是打開每個代理的實例(當我的應用程序池啓動時)將其渠道工廠加載到應用程序域中。我同意你的問題不能是XmlSerialization,因爲如文中所解釋的,如果我「禁用」通道工廠緩存,第二次調用也需要27秒,我假設它們都使用相同的XmlSerializer代碼。 – 2010-05-12 16:19:36

+0

我想知道「pluming」所用的時間量是否是這些代理類文件大小的結果。客戶端的wsdls和xsds是巨大的,因爲它們保留了每個方法和對象的歷史記錄(MethodA_1,MethodA_2,... MethodA_12,MethodAInput_1,MethodAInput_2等)。這使得svcutil生成的文件> 11MB。 – 2010-05-12 16:23:07

+0

@Matt Dearing:是的,我必須說,頻道的生成(因爲終端描述等都必須設置)絕對是這裏的問題。對於一個11MB的WSDL文件,這只是一個瘋狂的事情,而WCF爲使所有這些代理都可用而做的工作量是巨大的。你無法控制服務是一種恥辱,否則,我建議把它分解成單獨的服務。 – casperOne 2010-05-12 16:35:48

1

你的服務暴露了什麼樣的終結點?有時延遲是由於安全握手而發生的。另外我可以建議你使用net.tcp協議,如果它響應你的應用程序需求,它比別人快。

我也可以建議你開始一些工作的服務,因爲它總是會首先調用代理服務器,並且以後的調用(即使是其他用戶)也會更快。

告訴我,如果這有幫助。

+0

我無法控制服務本身。當我的應用程序池啓動時(爲了避免第一次「真正」調用服務時出現延遲),我曾考慮過創建服務代理類的實例,但我希望通過正確地生成XmlSerializer代碼或在至少找出爲什麼我的XmlSerializer程序集目前沒有幫助。 – 2010-05-12 14:50:56

+0

我使用的是xaml序列化程序,我沒有任何抱怨...第一次通話從2-4秒延遲我,但是我有安全對話...所以我真的不知道爲什麼你的客戶端速度太慢。 只是爲了體驗,嘗試創建你的服務,並使用相同的客戶端和相同的序列化程序... ...看看發生了什麼... – 2010-05-12 15:17:25

相關問題