创建 OData v4 客户端应用 (C#)
作者:Mike Wasson
在上一教程中,你创建了一个支持 CRUD 操作的基本 OData 服务。 现在,让我们为服务创建一个客户端。
启动 Visual Studio 的新实例并创建新的控制台应用程序项目。 在“ 新建项目 ”对话框中,选择“ 已安装>的模板>”“Visual C#>Windows 桌面”,然后选择“ 控制台应用程序” 模板。 将项目命名为“ProductsApp”。
注意
还可以将控制台应用添加到包含 OData 服务的同一个 Visual Studio 解决方案。
安装 OData 客户端代码生成器
在“工具”菜单上,选择“扩展和更新”。 选择“ 联机>Visual Studio 库”。 在搜索框中,搜索“OData 客户端代码生成器”。 单击“ 下载 ”以安装 VSIX。 系统可能会提示重启 Visual Studio。
在本地运行 OData 服务
从 Visual Studio 运行 ProductService 项目。 默认情况下,Visual Studio 将浏览器启动到应用程序根目录。 记下 URI;在下一步中需要用到此。 使应用程序保持运行。
注意
如果将这两个项目放在同一解决方案中,请确保在不调试的情况下运行 ProductService 项目。 在下一步中,需要在修改控制台应用程序项目时保持服务运行。
生成服务代理
服务代理是一个 .NET 类,用于定义用于访问 OData 服务的方法。 代理将方法调用转换为 HTTP 请求。 你将通过运行 T4 模板来创建代理类。
右键单击项目。 选择“添加”>“新项”。
在 “添加新项 ”对话框中,选择“ Visual C# 项>代码>OData 客户端”。 将模板命名为“ProductClient.tt”。 单击“ 添加 ”并单击安全警告。
此时,将收到一个可以忽略的错误。 Visual Studio 会自动运行模板,但模板首先需要一些配置设置。
打开文件ProductClient.odata.config。 Parameter
在 元素中,粘贴 ProductService 项目中的 URI (上一步) 。 例如:
<Parameter Name="MetadataDocumentUri" Value="http://localhost:61635/" />
再次运行模板。 在“解决方案资源管理器”中,右键单击 ProductClient.tt 文件,然后选择“运行自定义工具”。
该模板创建一个名为 ProductClient.cs 的代码文件,用于定义代理。 开发应用时,如果更改 OData 终结点,请再次运行模板以更新代理。
使用服务代理调用 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