資料交換 API 比較(ASMX, WCF, OpenAPI, gRPC)
Web Service | Windows Communication Foundation(WCF) | OpenAPI | gRPC | |
ASMX, Web 參考(Web Reference) ,Web 服務 | 服務參考(Service Reference), WCF 服務 | 舊稱: Swagger | ||
定義檔 | wsdl | wsdl | json | proto |
提供服務 | .NET Framework | .NET Framework 3.0~4.8 .NET Core 需要第三方套件: CoreWCF[5] | .NET Framework 或 Core 都可以,要搭配Swashbuckle 或 NSwag | .NET Core 3.0+ |
測試工具 | 自帶的網頁, SoapUI | WcfTestClient.exe, SoapUI | 自帶的網頁(Swagger), Postman | gRPCurl, gRPCui |
*目前(2021-10)無法掛在 IIS 上跑,因為某些 HTTP/2 功能不支援,未來有可能。微軟目前建議以服務方式執行[1] |
進入 .NET Core 後不再提供寫 asmx, WCF,但加參考還是可以,跟外部介接還是有機會遇到
新專案提供給別人大概都要以 OpenAPI 為主了,gRPC 可以從公司內部的小專案開始試用
下面是個人比較 OpenAPI, gRPC 和一些心得
- 寫 Server 端:
寫 OpenAPI 較接近寫 MVC Controller 的感覺,唯 API Controller 的路由和 MVC Controller 不同需要注意一下(記得幫 Action 命名[6])
gRPC 比較類似 WCF 寫 Function,但看起來不能和一般網站放在同一隻程式 - 架設:
OpenAPI 就掛在 IIS 底下跑,gRPC 目前不能放上 IIS 要獨立一隻程式用服務的方式跑、自己占用一個 port - 寫 Client 端:
- Web Service, WCF, OpenAPI 加參考比較沒什麼問題,gRPC 看微軟的文件指出需要 .NET Framework 4.6.1+ 和 Windows 10 組建19622+。[9]
- 我曾發生 Core 3.1 的 Client 加 VB Framework 的 WCF 參考,卻發生 enum 傳回後端都為 0 的問題,看起來是加參考產生的 Proxy 程式碼有 bug 沒把數值帶出來,stackoverflow 和 github 上可以找到相關討論。[7][8]
- 另一個案例是 Core 3.1 的程式加 JAVA 的 SOAP 參考,但帳密不知道為什麼傳不過去,這應該能用 SoapUI 架 mock Server 抽絲剝繭,但當時專案真的很趕,只好改成自己寫 Helper 用 HttpWebRequest 包裝 XML、帳密放 Header Authorization 傳送出去,回來的資料再解 XML 挖出來。
[1]「自我裝載的 gRPC 應用程式」:https://docs.microsoft.com/zh-tw/dotnet/architecture/grpc-for-wcf-developers/self-hosted
「為何將 WCF 遷移至 ASP.NET Core gRPC」:https://docs.microsoft.com/zh-tw/aspnet/core/grpc/why-migrate-wcf-to-dotnet-grpc
「比較 gRPC 服務與 HTTP API」:https://docs.microsoft.com/zh-tw/aspnet/core/grpc/comparison
「適用於 WCF 開發人員的 ASP.NET Core gRPC」:https://docs.microsoft.com/zh-tw/dotnet/architecture/grpc-for-wcf-developers/
[5] CoreWCF: https://github.com/CoreWCF/CoreWCF
[6] 「 Generating HTTP API clients using Visual Studio Connected Services」:https://devblogs.microsoft.com/dotnet/generating-http-api-clients-using-visual-studio-connected-services/#well-described-apis-generate-better-client-code
[7] Imported WCF Reference ignores Enum values:https://github.com/dotnet/wcf/issues/4105
[8] .Net Core 3.1 Imported WCF Reference ignores Enum values:https://stackoverflow.com/questions/63807819/net-core-3-1-imported-wcf-reference-ignores-enum-values
[9] .NET 支援平臺上的 gRPC:https://docs.microsoft.com/zh-tw/aspnet/core/grpc/supported-platforms