创建 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 项目。 在下一步中,需要在修改控制台应用程序项目时保持服务运行。

生成服务代理

服务代理是一个 .NET 类,用于定义用于访问 OData 服务的方法。 代理将方法调用转换为 HTTP 请求。 你将通过运行 T4 模板来创建代理类。

右键单击项目。 选择“添加”>“新项”。

解决方案资源管理器对话框的屏幕截图,其中显示了用于将新项添加到项目的文件路径,其中突出显示了黄色的选项。

“添加新项 ”对话框中,选择“ Visual C# 项>代码>OData 客户端”。 将模板命名为“ProductClient.tt”。 单击“ 添加 ”并单击安全警告。

“新建项产品应用设置”窗口的屏幕截图,其中显示了 O Data 客户端产品模板,并盘旋下方的名称字段以添加新名称。

此时,将收到一个可以忽略的错误。 Visual Studio 会自动运行模板,但模板首先需要一些配置设置。

错误消息窗口的屏幕截图,其中显示了一个错误选项卡和一个警告选项卡,以及错误的详细消息。

打开文件ProductClient.odata.config。 Parameter 在 元素中,粘贴 ProductService 项目中的 URI (上一步) 。 例如:

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

产品客户端 O Data dot 配置文件的屏幕截图,其中显示了粘贴到 参数元素中的 URL 示例。

再次运行模板。 在“解决方案资源管理器”中,右键单击 ProductClient.tt 文件,然后选择“运行自定义工具”。

该模板创建一个名为 ProductClient.cs 的代码文件,用于定义代理。 开发应用时,如果更改 OData 终结点,请再次运行模板以更新代理。

解决方案资源管理器窗口菜单的屏幕截图,其中突出显示了已创建的产品客户端 dot c 文件,该文件定义了代理。

使用服务代理调用 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