我有一个 ASP.NET Core 应用程序,它从另一个库调用服务。该服务使用外部 API,这需要sessionId. 我们必须调用 Login API 方法来获取sessionId. 这sessionId能活多久,什么时候可以改变——我们不知道。规则是:sessionId1个请求有效,10个请求有效,100个请求有效,1分钟有效,10分钟有效,1天有效……没人知道。
该服务有许多方法可以调用类似的 API:
public class BillRequest
{
private readonly HttpClient client;
public BillRequest()
{
client = new HttpClient
{
BaseAddress = new Uri("https://myapi.com/api/v2/")
};
}
public async Task<List<Dto1>> CustomerBankAccountListAsync(int start, int count)
{
List<KeyValuePair<string, string>> nvc = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("sessionId", CURRENT_SESSION_ID)
};
var customerStream = await client.PostAsync("List/CustomerBankAccount.json", new FormUrlEncodedContent(nvc));
var customerString = await customerStream.Content.ReadAsStringAsync();
//....
}
public async Task<List<Dto2>> Method2(int start, int count)
{
List<KeyValuePair<string, string>> nvc = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("sessionId", CURRENT_SESSION_ID)
};
var customerStream = await client.PostAsync("List/Method2.json", new FormUrlEncodedContent(nvc));
var customerString = await customerStream.Content.ReadAsStringAsync();
//....
}
// logic to get SessionId here
public async Task LoginAsync()
{
}
如何实施以保存此sessionId内部服务?
有很多选项可以实现:
Login
每次调用方法之前调用方法。易于实现,但方法不好,因为那时我们有很多不必要的请求并且sessionId
只使用一次
保存sessionId
web 应用程序级别并尝试捕获异常,当任何方法返回“无效 sessionId”时,然后调用Login
方法,该方法将返回一个新的sessionId
. 在这种情况下,我们必须传递sessionId
给类的构造函数BillRequest
。它可以工作,但我不喜欢将服务责任转移给其他人,因为如何使用 API 是服务的内部责任。
保存sessionId
在服务本身内部并在服务内部调用Login
方法,当旧sessionId
的被认为无效时,用新的等重写它。但是如何将其保存为内存中的“静态”?我不想将它保存到任何外部位置(文件系统、云等),但我也不能保存到类的变量中,因为可以重新创建类的对象......
心有法竹
相关分类