Microsoft .NET 環境下以 Contract First 方式開發 Web Services

Web Services 開發方式,無外乎 "Contract First" 或 "Code First" 兩種形式。先決定 Serives Contract 再撰寫 Services 程式碼是所謂的 "Contract First" 的形式,反之,先撰寫 Services 程式碼再產生 Contract 就是  "Code First" 形式。

ASP.NET 中加上個 "WebMethod" Attribute,一個單純 Method 自動變成 Web Service,Java JSR 181 規格也是同樣加上個 "@WebMethod" 即達到相同效果。"Code First" 開發簡易,易學易懂,但是也容易將 Web Services 淪為一種 XML 形式的 Remote Procedure Call,喪失了 Services Oriented 精神。

微軟於 2006 年12月釋出的 Web Services Software Factory 雖然符合了"Contract First"的精神,卻缺乏了匯入 XML Schema 的功能,對於跨程式語言情境並不合適。在 Simon Guest 的 Web Services 互通性錄影中,我們可以知道,即便已經有了 WS-I Basic Profile 的規範,以 Web Services 傳遞複雜資料型態時,未必每種語言函式庫皆能夠單靠 WSDL 解析出複雜資料型態格式,依靠工具所產生的 WSDL 也常發現錯誤,許多時候我們仍需藉助 XML Schema 內容輔助程式碼的產生。因此先決定複雜資料型態的 XML Schema 可以降低不同程式語言 Web Services 互通時的風險。對於複雜資料型態的傳遞,先思考 XML Schema 內容,單就互通性而言,就已經是一種好的作法。更何況 Services Oriented 精神,Contract 本就是 Services 提供與使用者間互通互信的依據,先訂定 "Contract" 比較符合實際的應用現況。

要實現 "Contract First",不僅止於先訂妥 XML Schema 這麼單純了,XML Schema 雖定義了 Message 格式,但是沒有包含 Operation (Method) 資訊,沒有包含連接點 (Domain Name / TCP Port Number) 資訊,沒有包含 WSDL NameSpace 資訊...。以 Microsoft .NET Framework SDK 為例,.NET Framework SDK 中的命令列工具 wsdl.exe 可以依照 WSDL 檔案產生 Server 或 Clinet 端必要之程式碼,命令列工具 xsd.exe 可以依照 XML Schema (.xsd) 產生存取該 XML 的 C#/VB 程式碼,但是只有 Message 的 XML Schema 是不足以描述 Contract,開發人員需再自行補上 Message 以外所缺少的資訊,組合出完整的 WSDL 檔案方能描述 Contract,對於不瞭解 WSDL 詳細規格的人而言,以 Microsoft .NET  內建的工具實現 "Contract First" 並不容易。

2005 年 MSDN 雜誌有兩篇文章也曾討論過此一問題:
https://msdn.microsoft.com/msdnmag/issues/05/05/ServiceStation/default.aspx
https://msdn.microsoft.com/msdnmag/issues/05/06/ServiceStation/default.aspx

並介紹了一個免費的 Web Services Contract First Wizard for Microsoft Visual Studio 2003, 目前也已經提供了 Visual Studio 2005 的版本,此工具可由此下載,並且附上一個不錯的入門文件,對於有興趣以 "Contract First" 方式以 Microsoft .NET 開發 Services Orineted 應用的朋友不妨參考之。