.NET Core 2.1 Вызов различных API с одним и тем же HttpClient - PullRequest
0 голосов
/ 05 ноября 2018

У меня следующий сценарий: пользователь меняет номер своего мобильного телефона, сначала я должен проверить этот номер, отправив 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 в моем случае) после первого, это исключение выдается.

enter image description here

Я пытался найти хороший обходной путь для этой проблемы, который не меняет мой код и архитектуру кардинально, но до сих пор ничего не помогало. Так какие-нибудь предложения? Спасибо!

...