예제 #1
0
    public async Task <string> Value()
    {
        if (!cache.TryGetValue <string>("xti_token", out var token) || string.IsNullOrWhiteSpace(token))
        {
            token = await source.Value();

            cache.Set("xti_token", token);
        }
        return(token);
    }
예제 #2
0
    private async Task <TResult> Post <TResult, TModel>(string action, string modifier, TModel model, bool retryUnauthorized)
    {
        using var client = httpClientFactory.CreateClient();
        if (!action.Equals("Authenticate", StringComparison.OrdinalIgnoreCase))
        {
            var token = await xtiToken.Value();

            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        }
        var url = await clientUrl.Value(action, modifier);

        if (model == null)
        {
            throw new ArgumentNullException(nameof(model));
        }
        object transformedModel = model;

        if (model is Forms.Form form)
        {
            transformedModel = form.Export();
        }
        var serialized = JsonSerializer.Serialize(model, jsonSerializerOptions);

        using var content  = new StringContent(serialized, Encoding.UTF8, "application/json");
        using var response = await client.PostAsync(url, content);

        var responseContent = await response.Content.ReadAsStringAsync();

        TResult result;

        try
        {
            if (response.IsSuccessStatusCode)
            {
                var resultContainer = JsonSerializer.Deserialize <ResultContainer <TResult> >
                                      (
                    responseContent, jsonSerializerOptions
                                      );
                if (resultContainer == null)
                {
                    throw new ArgumentNullException(nameof(resultContainer));
                }
                result = resultContainer.Data ?? throw new ArgumentNullException("resultContainer.Data");
            }
            else if (response.StatusCode == HttpStatusCode.Unauthorized && retryUnauthorized)
            {
                xtiToken.Reset();
                result = await Post <TResult, TModel>(action, modifier, model, false);
            }
            else
            {
                var resultContainer = string.IsNullOrWhiteSpace(responseContent)
                    ? new ResultContainer <ErrorModel[]>()
                {
                    Data = new ErrorModel[] { }
                }
                    : JsonSerializer.Deserialize <ResultContainer <ErrorModel[]> >(responseContent);
                throw new AppClientException(url, response.StatusCode, responseContent, resultContainer?.Data ?? new ErrorModel[0]);
            }
        }
        catch (JsonException ex)
        {
            throw new AppClientException(url, response.StatusCode, responseContent, new ErrorModel[] { new ErrorModel {
                                                                                                           Message = ex.Message
                                                                                                       } });
        }
        return(result);
    }