要測試WCF(.svc)或WebService(.asmx),WebServiceStudio堪稱最方便的GUI工具。而我平日用的是Adam Lesień改良的延伸版本--WebServiceStudio2,比WebService Studio再多了一些輔助功能。

最近解析某個WCF服務時,遇到一個狀況: 在WebServiceStudio輸入svc網址後按下Get按鈕,Message頁籤陸續顯示解析WSDL、產生Proxy物件程序的訊息:

Initializing
Generating WSDL
Generating Proxy
Compiling Proxy
Generated Assembly
Reflecting Proxy Assembly
Ready To Invoke

看似一切正常,但Invoke頁籤中卻沒有半個方法(Method),清單空無一物自然無從測試;而同時間測試其他SVC或ASMX,倒都能順利取得方法清單,未出現相同問題。

既是開源專案,第一個念頭便是"Use the source, Luke!"。

追進程式碼攪和了一陣子,找出問題出在依據WSDL產生的Proxy Class程式碼只有註解,其中空無一物。於是回到源頭,使用wdsl.exe指令實測產生Proxy類別:

D:\>wsdl httq://some_server/WCF/PSWS.svc /o:PSWS.cs

Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Warning: This web reference does not conform to WS-I Basic Profile v1.1.
SOAP 1.1 binding was not found: WS-I's Basic Profile 1.1 consists of implementation guidelines that recommend how a set of core Web services specifications should be used together to develop interoperable Web services. For the 1.1 Profile,
those specifications are SOAP 1.1, WSDL 1.1, UDDI 2.0, XML 1.0 and XML Schema.

For more details on the WS-I Basic Profile v1.1, see the specification
at http://www.ws-i.org/Profiles/BasicProfile-1.1.html.

Warning: one or more optional WSDL extension elements were ignored.
Warnings were encountered. Review generated source comments for more details.

Writing file 'PSWS.cs'.

wsdl.exe的警告訊息如同一盞明燈!! 由訊息看來,由於PSWS.svc沒有提供SOAP 1.1 Binding,雖然不致發生錯誤,但卻會導致某些WSDL延伸元素被忽略。我想這解釋了WebService Studio在解析時沒有傳出錯誤,但因重要的WSDL元素被略過,造成空白的Proxy類別,進而未能產生方法清單。
(註: WCF/WebService可以透過Profile、EndPoint等一堆設定決定要提供哪些Binding管道,只是設定細節頗為繁瑣,每次都讓我頭昏。這類精巧嚴謹的工程通常不是我的菜,所以WCF為什麼會缺少SOAP 1.1及設定Binding的議題,就悄悄地排除在本文討論範圍之外囉~ 啾咪 ^.<)

有了不支援SOAP 1.1的提示,很快找到WebServiceStudio2有個Options選單可以指定WSDL Protocol,選定SOAP12就順利解決問題囉!

不過,除了使用wsdl.exe實測,有沒有辦法更快斷定這是SOAP12的問題呢?

研究發現當遇到WCF不支援SOAP 1.1協定而導致Invoke清單空白時,WSDLs & Proxy頁籤仍有內容,而其中可以找到類似<soap12:binding transport=”http://schemas.xmlsoap.org/soap/http” />等soap12:開頭的描述,可協助判斷該服務支援SOAP12,未來可藉此鎖定茶包,一刀斃命!


Comments

# by Alex Lee

"D:\>wsdl httq://some_server/WCF/PSWS.svc /o:PSWS.cs" 這個httq 是新一代的通訊協定嗎? XDDDD

# by Jeffrey

to Alex Lee, 呵! 這是本站的獨門暗號,"httq://*"代表"這裡我本來想寫一個http連結,但由於只是不存在模擬網址,所以寫成httq請部落格平台、RSS閱讀器、瀏覽器不要雞婆加上超連結把使用者帶往火星"。(典故: http://blog.darkthread.net/post-2009-04-03-ie-kiosk.aspx#4473)

# by Jason

只做簡單的測試,VS內建的也不錯用。 參數也可以直接打,不用點一下後,再移到旁邊輸入 "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe"

Post a comment