我正在尝试创建一个可以调用另一个 API 并将一些数据存储在 SQL 数据库中的 API,即:
Client -> HTTP GET/POST -> API -> calls 2ND API -> stores data in SQL
我已经通过控制台应用程序实现了这一点:
using System.Net;
using System.Net.Http.Headers;
using System.Text.Json;
using WebApiClient.Data;
using HttpClient client = new();
client.DefaultRequestHeaders.Accept.Clear();
var breweries = await ProcessBreweriesApiAsync(client);
foreach (var brew in breweries)
{
Console.WriteLine($"id: {brew.Id}");
Console.WriteLine($"name: {brew.Name}");
Console.WriteLine($"brewery_type: {brew.BreweryType}");
// Console.WriteLine($"address_1: {brew.Address1}");
// Console.WriteLine($"address_2: {brew.Address2}");
// Console.WriteLine($"address_3: {brew.Address3}");
// Console.WriteLine($"city: {brew.City}");
// Console.WriteLine($"state_province: {brew.StateProvince}");
// Console.WriteLine($"postal_code: {brew.PostalCode}");
// Console.WriteLine($"longitude: {brew.Longitude}");
// Console.WriteLine($"latitude: {brew.Latitude}");
// Console.WriteLine($"phone: {brew.Phone}");
// Console.WriteLine($"state: {brew.State}");
// Console.WriteLine($"street: {brew.Street}");
Console.WriteLine("Saving data into SQL");
var db = new AppDbContext();
db.Breweries?.AddRange(breweries);
db.SaveChanges();
Console.WriteLine("Finished Saving");
Console.WriteLine();
}
static async Task<List<BreweryModel>> ProcessBreweriesApiAsync(HttpClient client)
{
await using Stream stream =
await client.GetStreamAsync("https://api.openbrewerydb.org/breweries");
var breweries =
await JsonSerializer.DeserializeAsync<List<BreweryModel>>(stream);
return breweries ?? new();
}
但是,我现在尝试使用 ASP.NET Web API 实现相同的功能,使用我在之前的教程中学到的几个概念,例如存储库模式来习惯这些概念,我似乎无法弄清楚如何构建这个。
我在接口中创建了一个方法sig,然后是该方法的异步实现,但是,这个错误表明我没有实现该接口,但是当我将接口更改为异步时,我得到:
“async”修饰符只能在具有主体的方法中使用。CS1994
控制器:
[ApiController]
[Route("api/[controller]")]
public class BreweryController : ControllerBase
{
private readonly IBreweryRepo _repository;
public BreweryController(IBreweryRepo repository)
{
_repository = repository;
}
[HttpGet(Name = "UpdateBreweries")]
public ActionResult<IEnumerable<BreweryModel>> UpdateBreweries()
{
Console.WriteLine("Updating Breweries Now...");
var breweries = _repository.ImportBreweries();
_repository.SaveChanges();
return Ok (breweries);
}
}
接口:
using XXX.Models;
namespace XXX.Data
{
public interface IBreweryRepo
{
Task ImportBreweries ();
bool SaveChanges();
}
}
实施:
namespace XXX.Data
{
public class BreweryRepo : IBreweryRepo
{
//DI
private readonly AppDbContext _context;
public BreweryRepo(AppDbContext context)
{
_context = context;
}
//public async IActionResult UpdateBreweries <BreweryModel<List>> (HttpClient client)
public async Task UpdateBreweries()
{
HttpClient client = new HttpClient();
await using Stream stream =
await client.GetStreamAsync("https://api.openbrewerydb.org/breweries");
var breweries =
await JsonSerializer.DeserializeAsync<List<BreweryModel>>(stream);
_context.Breweries.AddRange(breweries);
}
public bool SaveChanges()
{
return (_context.SaveChanges() >= 0);
}
}
}
似乎无法让它异步加载。
第一个错误: 尽管返回类型很好,但接口“ImportBreweries”中的方法名称与其具体实现“UpdateBreweries”不同。接口及其实现必须与方法的签名匹配。
第二个错误: 接口定义了要实现的类的契约。异步行为是特定于方法的实现细节,因此它不是接口契约的一部分。