У меня следующий сценарий: пользователь меняет номер своего мобильного телефона, сначала я должен проверить этот номер, отправив SMS.
Я должен сделать это с помощью API под названием Foo, тогда, если ответ от Foo API будет успешным, я должен изменить этот номер телефона, используя другой API с именем Bar.
Вот мое действие в WEB-проекте:
[HttpPut]
public IActionResult ApprovePhone(PhoneEditVerificationVm model)
{
if (ModelState.IsValid)
{
if (_gApiConnector.ReadFromFooApi("Verification", "CheckUserPhoneChangeApprovement", _filterModelHelper.GetQueryStringFromSimpleFilterModel(model)).IsHttpSuccess)
{
_gApiConnector.PutToBarApi("Persons", "EditUserPhone", model.VerificationCode);
return Json(
new
{
success = true,
title = StringResource.Notification,
message = StringResource.PhoneNumberChangedSuccessfully
});
}
}
return Json(
new
{
success = false,
errorTitle = StringResource.Notification,
errorText = ErrorMessageResource.Error,
modelErrors = ModelState.AllErrors()
});
}
Вот методы ReadFromFooApi и PutToBarApi, они вызывают методы ReadFromApi и PutToApi соответственно, как показано ниже:
public ApiJsonResult ReadFromFooApi(string controllerName, string actionName, string query)
{
return ReadFromApi(_contentApiOptions.BaseEndpoint, controllerName, actionName, query);
}
public ApiJsonResult PutToBarApi<T>(string controllerName, string actionName, T model)
{
return PutToApi(_physicalApiOptions.BaseEndpoint, controllerName, actionName, model);
}
Здесь вы можете увидеть метод ReadFromApi, нет смысла писать реализацию метода PutToApi, потому что оба метода практически одинаковы, единственное отличие состоит в том, что вместо GetAsync (url) я использую PutAsync (url, .. .) метод.
private ApiJsonResult ReadFromApi(string apiAddress, string controllerName, string actionName, string query)
{
if (!string.IsNullOrEmpty(controllerName))
{
var client = _apiHttpClient.GetClient(apiAddress, _identityServerOptions.Authority, _identityServerOptions.ClientName, _identityServerOptions.ClientSecret);
var url = controllerName;
if (!string.IsNullOrEmpty(actionName))
url += $"/{actionName}";
if (!string.IsNullOrEmpty(query))
url += query.StartsWith("?") ? query : $"/{query}"
var result = client?.Result?.GetAsync(url)?.Result;
if (result != null)
{
return new ApiJsonResult { IsHttpSuccess = result.IsSuccessStatusCode, JsonData = result?.Content?.ReadAsStringAsync()?.Result };
}
}
return new ApiJsonResult();
}
Проблема в том, что в моем файле startup.cs я зарегистрировал HttpContextAccessor в качестве службы Sigleton, как показано ниже:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Поэтому, когда я пытаюсь вызвать другой метод API (PutToBarApi в моем случае) после первого, это исключение выдается.
Я пытался найти хороший обходной путь для этой проблемы, который не меняет мой код и архитектуру кардинально, но до сих пор ничего не помогало. Так какие-нибудь предложения? Спасибо!