почему httpcontent readasstringasync выдает отмененное исключение - PullRequest
0 голосов
/ 13 мая 2019

Я не уверен, насколько мой код здесь важен для выяснения проблемы, поэтому я начну с самого начала.Я использую Injection для создания веб-программы Azure, и она выглядит следующим образом:

static void Main()
{
    try
    {
        //CompositionRoot code omitted - however, this part works.
        CompositionRoot().Resolve<Application>().Run();
    }
    catch (Exception ex)
    {
        //some logging
    }
}

Тогда мой метод Application Run выглядит следующим образом:

public void Run()
{
    var result = _someService.SomeMethod(new SomeParam()).GetAwaiter().GetResult();
}

Затем служба вызываетсторонний API и делает вызов следующим образом:

public async Task<int> SomeMethod(SomeModel model)
{
    var kvp = new List<KeyValuePair<string, string>> {
         new KeyValuePair<string, string>("api_key", "api_key"),
    }

    var result = await FormPostStreamAsync(kvp, "some uri", null, CancellationToken.None);

    var json = result.Content.ReadAsStringAsync().Result;
}

public async Task<HttpResponseMessage> FormPostStreamAsync(IList<KeyValuePair<string, string>> content, string uri, IList<KeyValuePair<string, string>> headers, CancellationToken cancellationToken)
{
    if (cancellationToken.IsCancellationRequested) return null;

    if (headers == null) headers = new List<KeyValuePair<string, string>>();
    using (var client = new HttpClient())
    using (var request = new HttpRequestMessage(HttpMethod.Post, uri))
    using (var httpContent = CreateKvpHttpContent(content))
    {
        client.Timeout = TimeSpan.FromMinutes(30);
        foreach (var header in headers)
        {
            client.DefaultRequestHeaders.Add(header.Key, header.Value);
        }
        request.Content = httpContent;
        return await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
    }
}

Когда я вызываю вышеуказанный код: var json = result.Content.ReadAsStringAsync().Result; я получаю исключение:

Запрос был прерван:запрос был отменен.

Я не могу понять, почему.Я нигде не звоню, и это не время ожидания, потому что это происходит мгновенно, и я установил тайм-аут в 30 минут, чтобы посмотреть, будет ли это иметь значение.У объекта результата есть значения, у него есть заголовки и код состояния 200. Таким образом, кажется, что пост-запрос сработал, но когда он пытается проанализировать ответ, он выдает это исключение.У кого-нибудь есть идеи, где я ошибся?

Если я посмотрю ответ через фиддлер, то увижу следующее:

{"result_code": 0, "result_message": "Некоторое сообщение "," result_output ":" json "}

РЕДАКТИРОВАТЬ: После дополнительного тестирования я обнаружил, что если я вызываю этот же код (те же параметры) (без внесения каких-либо изменений) с веб-сайтатогда это работает.Однако, если я вызываю это из приложения, которое я показал выше, это не так.

...