共用方式為


建立 OData v4 用戶端應用程式 (C#)

演講者:Mike Wasson

在上一教學課程中,您建立了支援 CRUD 操作的基本 OData 服務。 現在讓我們為該服務建立一個用戶端。

啟動 Visual Studio 的新執行個體並建立新的主控台應用程式專案。 在「新專案」對話方塊中,選擇「已安裝>範本>Visual C#>Windows 桌面」,然後選擇「主控台應用程式」範本。 將專案命名為「ProductsApp」。

新專案對話方塊的螢幕擷取畫面,醒目顯示了透過功能表選項建立新主控台應用程式專案的路徑。

注意

您也可以將主控台套用新增至包含 OData 服務的相同 Visual Studio 解決方案。

安裝 OData 用戶端程式碼產生器

從「工具」功能表中,選擇「擴充和更新」。 選擇「線上>Visual Studio 庫」。 在搜尋框中,搜尋「OData 用戶端程式碼產生器」。 按一下「下載」以安裝 VSIX。 系統可能會提示您重新啟動 Visual Studio。

擴充和更新對話方塊的螢幕擷取畫面,顯示用於下載和安裝 O Data 的 VS I X 用戶端程式碼產生器的功能表。

在本地執行 OData 服務

從 Visual Studio 執行 ProductService 專案。 預設情況下,Visual Studio 會啟動瀏覽器存取應用程式根目錄。 記下 URI;您在下一步中將需要它。 讓應用程式保持執行。

Web 瀏覽器本機主機的螢幕擷取畫面,顯示在 Visual Studio 上執行的產品服務項目的程式碼。

注意

如果將兩個專案放在同一個解決方案中,請確保執行 ProductService 專案而不進行偵錯。 在下一步中,您需要在修改主控台應用程式專案時保持服務執行。

產生服務 Proxy

服務 Proxy 程式是一個 .NET 類別,它定義了存取 OData 服務的方法。 Proxy 將方法呼叫轉換為 HTTP 請求。 您將透過執行 T4 範本來建立 Proxy 類別。

以滑鼠右鍵按一下專案。 選取 [新增]>[新項目]

方案總管對話方塊的螢幕擷取畫面,透過以黃色醒目顯示選項來顯示向專案新增專案的檔案路徑。

在「新增項目」對話方塊中,選擇「Visual C# 項目>程式碼>OData 用戶端」。 將範本命名為「ProductClient.tt」。 點擊「新增」並點擊安全性警告。

「新項目產品應用程式設定」視窗的螢幕擷取畫面,顯示 O Data 用戶端產品範本,並圈選下面的名稱欄位以新增名稱。

此時,您將收到一個錯誤,您可以忽略該錯誤。 Visual Studio 會自動執行範本,但範本首先需要一些設定。

錯誤訊息視窗的螢幕擷取畫面,顯示一個錯誤標籤和一個警告標籤,以及詳細的錯誤訊息。

開啟 ProductClient.odata.config 檔案。在 Parameter 元素中,貼上來自 ProductService 專案的 URI (上一步)。 例如:

<Parameter Name="MetadataDocumentUri" Value="http://localhost:61635/" />

產品用戶端 OData.config 檔案的螢幕擷取畫面,顯示了貼上到參數元素後的 URI 範例。

再次執行範本。 在方案總管中,以滑鼠右鍵按一下 ProductClient.tt 檔案並選擇「執行自訂工具」。

此範本會建立一個名為 ProductClient.cs 的程式碼檔案來定義 Proxy。 在開發應用程式時,如果變更 OData 端點,請再次執行範本以更新 Proxy。

方案總管視窗功能表的螢幕擷取畫面,醒目顯示了已建立的產品用戶端 .cs 檔案,該檔案定義了 Proxy。

使用服務 Proxy 呼叫 OData 服務

開啟檔案 Program.cs 並將樣板程式碼替換為以下內容。

using System;

namespace ProductsApp
{
    class Program
    {
        // Get an entire entity set.
        static void ListAllProducts(Default.Container container)
        {
            foreach (var p in container.Products)
            {
                Console.WriteLine("{0} {1} {2}", p.Name, p.Price, p.Category);
            }
        }

        static void AddProduct(Default.Container container, ProductService.Models.Product product)
        {
            container.AddToProducts(product);
            var serviceResponse = container.SaveChanges();
            foreach (var operationResponse in serviceResponse)
            {
                Console.WriteLine("Response: {0}", operationResponse.StatusCode);
            }
        }

        static void Main(string[] args)
        {
            // TODO: Replace with your local URI.
            string serviceUri = "http://localhost:port/";
            var container = new Default.Container(new Uri(serviceUri));

            var product = new ProductService.Models.Product()
            {
                Name = "Yo-yo",
                Category = "Toys",
                Price = 4.95M
            };

            AddProduct(container, product);
            ListAllProducts(container);
        }
    }
}

serviceUri 的值替換為先前的服務 URI。

// TODO: Replace with your local URI.
string serviceUri = "http://localhost:port/";

當您執行該應用程式時,它應該輸出以下內容:

Response: 201
Yo-yo 4.95 Toys