Как мне прочитать httpresponse, чтобы получить возвращаемые значения: - PullRequest
3 голосов
/ 12 июля 2020

Я думаю, что я близок к тому, чтобы заставить это работать, но я не уверен, как получить содержимое, чтобы узнать, какое сообщение результата возвращается в содержимом, чтобы увидеть, хорошая ли это запись или нет, и я просто не секрет производства. Я подошел близко ... могу видеть свои значения в Visual Studio Locals, но не могу до них добраться.

Это мои классы данных:

public class PurchaseOrder
{
    private List<POHeader> _headers = new List<POHeader>();
    private List<PODetail> _details = new List<PODetail>();

    [JsonProperty("HeaderAttributes")]
    public List<POHeader> Header
    {
        get { return _headers; }
        set { _headers = value; }
    }

    [JsonProperty("LineAttributes")]
    public List<PODetail> Details
    {
        get { return _details; }
        set { _details = value; }
    }    
}

public class POHeader
{
    private string _poNumber;
    private int _resultCode;
    private string _resultMessage;

    [JsonProperty("po_number")]
    public string PONumber
    {
        get { return _poNumber; }
        set { _poNumber = value; }
    }

    [JsonProperty("result_code")]
    public int ResultCode
    {
        get { return _resultCode; }
        set { _resultCode = value; }
    }

    [JsonProperty("result_msg")]
    public string ResultMsg
    {
        get { return _resultMessage; }
        set { _resultMessage = value; }
    }    
}

Это в классе APIClient :

public async Task<HttpResponseMessage> PostStreamAsync(string requestUrl, CancellationToken cancellationToken, object content)
{
    addHeaders();

    using (var request = new HttpRequestMessage(HttpMethod.Post, requestUrl))
    using (var httpContent = CreateHttpContentForStream(content))
    {
        request.Content = httpContent;

        using (var response = await _httpClient
            .SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken)
            .ConfigureAwait(false))
        {
            response.EnsureSuccessStatusCode();
            return response;
        }
    }
}

Это моя задача в классе TransmitPO:

public static async Task TransmitToService(List<PurchaseOrder> orders, CancellationToken cancellationToken, string path)
{
    ApiClient _client = new ApiClient(new Uri("myUrl"), "code");

    var results = await _client.PostStreamAsync(path, cancellationToken, orders);
    var deserializedResults = JsonConvert.DeserializeObject<List<PurchaseOrder>>(results);
}

И так я называю это при выполнении кода процесса:

await TransmitToService(poList, CancellationToken.None, poPath);

Здесь я создаю свой HttpClient ... хорошо, плохо, хуже? publi c частичный класс ApiClient {частный только для чтения HttpClient _httpClient; частный Uri BaseEndpoint {получить; устанавливать; }

    private string AuthToken { get; set; }

    public ApiClient(Uri baseEndpoint, string bToken)
    {
        BaseEndpoint = baseEndpoint;
        AuthToken = bToken;
        _httpClient = new HttpClient();
    }
}

1 Ответ

1 голос
/ 12 июля 2020

Вы пытаетесь десериализовать (удаленный) HttpResponseMessage, а не его содержимое.

private static readonly HttpClient _httpClient = new HttpClient();

public async Task<T> PostStreamAsync<T>(string requestUrl, CancellationToken cancellationToken, object content)
{
    addHeaders();

    using (var request = new HttpRequestMessage(HttpMethod.Post, requestUrl))
    using (var httpContent = CreateHttpContentForStream(content))
    {
        request.Content = httpContent;

        using (var response = await _httpClient
            .SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken)
            .ConfigureAwait(false))
        {
            response.EnsureSuccessStatusCode();
            return JsonConvert.DeserializeObject<T>(await response.Content.ReadAsStringAsync().ConfigureAwait(false));
        }
    }
}
var deserializedResults = _client.PostStreamAsync<List<PurchaseOrder>>(path, cancellationToken, orders);

Также вы должны убедиться, что вы не создаете новый HttpClient на запрос, иначе вы получите нестабильную ApiClient реализацию.

...