![创建 ASP.NET Core Web API 订单](/Users/zouding/文档/blog/文章/如何使用polly/
)
创建项目后,默认的 WeatherForecast 控制器已被删除,因为演示不需要它。
添加模型首先在 Models\Item.cs & Models\OrderDetails.cs 中添加 Order details 所需的模型,如下所示
public class Item { public int Id { get; set; } public string Name { get; set; } } public class OrderDetails { public int Id { get; set; } public string CustomerName { get; set; } public DateTime SetupDate { get; set; } public List<Item> Items { get; set; } } 添加订单控制器我们需要添加一个 Order 控制器,它将有一个 get action 方法,该方法根据输入的客户代码返回详细的订单。此方法还将对客户服务进行 HTTP 调用以获取客户代码的客户名称。
让我们首先在依赖容器中添加 httpclient 服务,以便我们可以在订单控制器中获取该对象 httpclient 以对客户服务进行 HTTP 调用。要在依赖容器中添加 httpclient 服务,请将以下行添加到 Startup.cs 中的 ConfigureServices 方法
services.AddHttpClient();我们将添加 Controllers\OrderController.cs 如下所示
[Route("api/[controller]")] [ApiController] public class OrderController : ControllerBase { private readonly ILogger<OrderController> _logger; private readonly IHttpClientFactory _httpClientFactory; private HttpClient _httpClient; private string apiurl = @"http://localhost:23833/"; private OrderDetails _orderDetails = null; public OrderController(ILogger<OrderController> logger, IHttpClientFactory httpClientFactory) { _logger = logger; _httpClientFactory = httpClientFactory; if (_orderDetails == null) { _orderDetails = new OrderDetails { Id = 7261, SetupDate = DateTime.Now.AddDays(-10), Items = new List<Item>() }; _orderDetails.Items.Add(new Item { Id = 6514, Name = ".NET Core Book" }); } } [HttpGet] [Route("GetOrderByCustomer/{customerCode}")] public OrderDetails GetOrderByCustomer(int customerCode) { _httpClient = _httpClientFactory.CreateClient(); _httpClient.BaseAddress = new Uri(apiurl); var uri = "/api/Customer/GetCustomerName/" + customerCode; var result = _httpClient.GetStringAsync(uri).Result; _orderDetails.CustomerName = result; return _orderDetails; } }apiurl – 是客户服务的 URL(主机和端口号)
出于演示目的,我对订单详细信息进行了硬编码,即所有客户的相同订单详细信息,但理想情况下,这些数据应该来自使用实体框架的数据库。
使用 Serilog 启用文件日志记录接下来检查添加 Polly 策略后代码的行为,我们将添加对 Serilog 日志记录的支持以记录到代码中的文件。
使用包管理器控制台将以下包安装到项目中
Install-Package Serilog.AspNetCore Install-Package Serilog.Settings.Configuration Install-Package Serilog.Sinks.File将 Serilog 的配置添加到 appsettings.json 文件中,如下所示
"Serilog": { "MinimumLevel": "Information", "Override": { "Microsoft.AspNetCore": "Information" }, "WriteTo": [ { "Name": "File", "Args": { "path": "Serilogs\\AppLogs.log" } } ] }在 Program.cs 文件中的 CreateHostBuilder 方法中配置 Serilog,如下代码所示
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseSerilog() .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });