C# 在while循环中使用一次性设备的必要性
这可能真的是个笑话,但我真的很想理解。我正在做一个控制台应用程序,它向Swapi(星球大战API)发出请求,并捕获API上可用的所有星际飞船。 当我点击他们的API()时,响应返回一个名为“next”的字段,该字段包含他们拥有的星际飞船的另一部分(API正在对每个请求进行分页) 我创建了一个类,它对它们的API执行第一个请求,反序列化对象,在一段时间内,我验证字段“next”是否为null,并使用字段“next”执行其余请求 这是我的密码C# 在while循环中使用一次性设备的必要性,c#,.net,.net-core,C#,.net,.net Core,这可能真的是个笑话,但我真的很想理解。我正在做一个控制台应用程序,它向Swapi(星球大战API)发出请求,并捕获API上可用的所有星际飞船。 当我点击他们的API()时,响应返回一个名为“next”的字段,该字段包含他们拥有的星际飞船的另一部分(API正在对每个请求进行分页) 我创建了一个类,它对它们的API执行第一个请求,反序列化对象,在一段时间内,我验证字段“next”是否为null,并使用字段“next”执行其余请求 这是我的密码 public class RequestToSwapiA
public class RequestToSwapiApi : IRequestToSwapiApi
{
private string Json;
private string ApiURL
{
get
{
return "https://swapi.co/api/starships/";
}
}
public async Task<RootObject> ReturnTheStarShipModels()
{
var request = new HttpClient();
this.Json = await request.GetStringAsync(this.ApiURL);
var rootObject = JsonConvert.DeserializeObject<RootObject>(this.Json);
while (rootObject.Next != null)
{
this.Json = await request.GetStringAsync(rootObject.Next);
var newDeserializeObject = JsonConvert.DeserializeObject<RootObject>(this.Json);
if (newDeserializeObject.Results != null)
{
rootObject.Results.AddRange(newDeserializeObject.Results);
}
rootObject.Next = newDeserializeObject.Next;
}
return rootObject;
}
}
public类RequestToSwapiApi:IRequestToSwapiApi
{
私有字符串Json;
私有字符串APIRL
{
得到
{
返回“https://swapi.co/api/starships/";
}
}
公共异步任务返回StarshipModels()
{
var request=newhttpclient();
this.Json=await request.GetStringAsync(this.ApiURL);
var rootObject=JsonConvert.DeserializeObject(this.Json);
while(rootObject.Next!=null)
{
this.Json=await request.GetStringAsync(rootObject.Next);
var newDeserializeObject=JsonConvert.DeserializeObject(this.Json);
if(newDeserializeObject.Results!=null)
{
rootObject.Results.AddRange(newDeserializeObject.Results);
}
rootObject.Next=newDeserializeObject.Next;
}
返回根对象;
}
}
我知道如果我使用一段代码“使用HttpClient”,我将避免使用一次性的。但是,如果我像上面那样在循环中使用块代码“UsingHttpClient”,那么我创建的对象将是可重用的吗?或者它将被创建,并可在循环每次运行时使用?我这样做可能会导致性能问题?回答特定问题:您不需要在while循环或整个请求方法中处理
HttpClient
。由于应用程序使用HttpClient
执行对外部API的请求,因此只有在应用程序关闭时才需要处理HttpClient
对于NETCore2.1及以上版本,有一个名为HttpClientFactory
的有用抽象,它为您创建和管理HttpClient
池。您只需在DI容器中注册即可:
public void ConfigureServices(IServiceCollection services)
{
// Registering IHttpClientFactory
services.AddHttpClient();
// ...
}
…并在您的类中注入:
public class RequestToSwapiApi
{
private readonly IHttpClientFactory _clientFactory;
public RequestToSwapiApi(IHttpClientFactory httpClientFactory)
{
_clientFactory = clientFactory;
}
public async Task<RootObject> ReturnTheStarShipModels()
{
HttpClient client = _clientFactory.CreateClient();
//...
公共类RequestToSwapiApi
{
私有只读IHttpClientFactory\u客户端工厂;
公共请求WAPIAPI(IHttpClientFactory httpClientFactory)
{
_clientFactory=clientFactory;
}
公共异步任务返回StarshipModels()
{
HttpClient客户端=_clientFactory.CreateClient();
//...
有关更多信息:
IDisposable
的类,并且知道他们需要使用将实例包装到中。我不知道HttpClient为什么会违反这条规则。我怀疑设计预期是它会像SqlConnection实例一样使用,b但在界面发布后,他们意识到它工作得更好,管理起来更像一个singleton@Flydog57好的,是的,IDisposable
必须被处理,但问题是什么时候。对于Web API,即在控制器方法中使用HttpClient
,HttpClient
应该只在服务关闭之前被调度down.@HeitorRibeiro for Net.Core 2.1及以上版本您可以使用IHttpClientFactory
处理HttpClient。有关详细信息,请参阅本文: