为什么httpcontent readasstringasync会引发已取消的异常

时间:2019-05-13 16:12:49

标签: c# json httpclient httpcontent jsonconvert

我不确定这里有多少代码与解决问题有关,所以我将从头开始。我使用Injection创建了一个天蓝色的Web作业程序,它看起来像这样:

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”}

编辑:经过更多测试,我发现如果我从网站调用相同的代码(相同的参数)(而不进行任何更改),则它可以工作。但是,如果我从上面显示的应用程序中调用此函数,则不会。

0 个答案:

没有答案