ASP.NET Core HttpClient получает правильные данные только после второго запроса - PullRequest
2 голосов
/ 14 марта 2019

Добрый день, я пытаюсь загрузить простой XML-документ, содержащий курсы валют, из http-вызова какого-то банковского API.

Я пытаюсь отправить обычный HTTP-запрос GET через HTTP-клиент в приложении ASP.NET Core.,Но обнаружил странное поведение, и я не могу определить причину этого.

Мой код Startup.cs для инициализации HttpClient выглядит:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 ;
services.AddHttpClient<UcbClient>(client =>
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
                client.DefaultRequestHeaders.Add("User-Agent", "SampleApp-UserAgent");
            }
        ).AddTransientHttpErrorPolicy(policy => 
                 policy.WaitAndRetryAsync(
                        options.RetryCount, 
                        retryAttempt => TimeSpan.FromSeconds(Math.Pow(10, 3))));

И сам UcbClient:

public class UcbClient
{
    private ILogger<UcbClient> _logger;
    private IOptions<UcbClientOptions> _options;
    private HttpClient _client;

    public UcbClient(ILogger<UcbClient> logger, IOptions<UcbClientOptions> options, HttpClient client)
    {
        _logger = logger;
        _options = options;
        _client = client;
    }

    public async Task GetExchangeRates()
    {
        var response = await _client.GetStringAsync("https://www.unicreditbank.cz/cs/exchange_rates_xml.exportxml.html");
        var response1 = await _client.GetStringAsync("https://www.unicreditbank.cz/cs/exchange_rates_xml.exportxml.html");
    }
}

Код был сокращен, чтобы быть более понятным.

Если я отправлю аналогичный запрос через Postman или открою URL-адрес непосредственно в браузере, я получу правильные результаты (например, некоторую часть xml):

<exchange_rates bank="UCB" base_currency="CZK" date="14.03.2019" version="1.0">
    <exchange_rate type="XML_RATE_TYPE_UCB_PURCHASE_VALUTA" valid_from="14.03.2019">
         <currency name="AUD" quota="1" rate="15.244"/>
            ....
    </exchange_rate>
    <exchange_rate type="XML_RATE_TYPE_UCB_SALE_VALUTA" valid_from="14.03.2019">
     <currency name="AUD" quota="1" rate="16.689"/>
            ....

Но если я сделаю то же самое с HttpClient (UcbClient.cs), первый запрос вернет неправильный xml (выглядит как какая-то схема):

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE exchange_rates SYSTEM "https://www.unicreditbank.cz/etc/designs/cee2020-pws-cz/xml/exchange_rates.dtd">
    <exchange_rates bank="UCB" base_currency="CZK" date="" version="1.0">
        <exchange_rate type="XML_RATE_TYPE_UCB_PURCHASE_VALUTA"/>
        <exchange_rate type="XML_RATE_TYPE_UCB_SALE_VALUTA"/>
        <exchange_rate type="XML_RATE_TYPE_UCB_MIDDLE_VALUTA"/>
        <exchange_rate type="XML_RATE_TYPE_CNB"/>
        <exchange_rate type="XML_RATE_TYPE_UCB_PURCHASE_DEVIZA"/>
        <exchange_rate type="XML_RATE_TYPE_UCB_SALE_DEVIZA"/>
        <exchange_rate type="XML_RATE_TYPE_UCB_MIDDLE_DEVIZA"/>
    </exchange_rates>

, но если яотправив второй запрос:

var response1 = await _client.GetStringAsync("https://www.unicreditbank.cz/cs/exchange_rates_xml.exportxml.html");

Я получаю правильные результаты.И я не могу понять причину этого.Что я упустил?Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...