資料交換 API 比較(ASMX, WCF, OpenAPI, gRPC)

  • 569
  • 0
  • 2021-10-29

資料交換 API 比較(ASMX, WCF, OpenAPI, gRPC)

 Web ServiceWindows Communication Foundation(WCF)OpenAPIgRPC
    ASMX, Web 參考(Web Reference) ,Web 服務服務參考(Service Reference), WCF 服務舊稱: Swagger 
定義檔wsdlwsdljsonproto
提供服務.NET Framework.NET Framework 3.0~4.8
.NET Core 需要第三方套件: CoreWCF[5]
.NET Framework 或 Core 都可以,要搭配Swashbuckle 或 NSwag      .NET Core 3.0+
測試工具自帶的網頁, SoapUIWcfTestClient.exe, SoapUI 自帶的網頁(Swagger), PostmangRPCurl, 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 端:
  1. Web Service, WCF, OpenAPI 加參考比較沒什麼問題,gRPC 看微軟的文件指出需要  .NET Framework 4.6.1+ 和 Windows 10 組建19622+。[9]
  2. 我曾發生 Core 3.1 的 Client 加 VB Framework 的 WCF 參考,卻發生 enum 傳回後端都為 0 的問題,看起來是加參考產生的 Proxy 程式碼有 bug 沒把數值帶出來,stackoverflow  和 github 上可以找到相關討論。[7][8]
  3. 另一個案例是 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