HttpClient GetAsync无法按预期工作

时间:2017-03-31 19:18:44

标签: c# uwp asp.net-core-mvc

使用Postman测试我的Web API时,我的API执行得很好!

在我的客户端应用程序中使用HttpClient运行代码时,代码执行时没有错误,但服务器上没有预期的结果。 可能会发生什么?

从我的客户端应用程序:

private string GetResponseFromURI(Uri u)
{
    var response = "";
    HttpResponseMessage result;
    using (var client = new HttpClient())
    {
        Task task = Task.Run(async () =>
        {
            result = await client.GetAsync(u);
            if (result.IsSuccessStatusCode)
            {
                response = await result.Content.ReadAsStringAsync();
            }
        });
        task.Wait();
    }
    return response;
}

这是API控制器:

[Route("api/[controller]")]
public class CartsController : Controller
{
    private readonly ICartRepository _cartRepo;

    public CartsController(ICartRepository cartRepo)
    {
        _cartRepo = cartRepo;
    }

    [HttpGet]
    public string GetTodays()
    {
        return _cartRepo.GetTodaysCarts();
    }

    [HttpGet]
    [Route("Add")]
    public string GetIncrement()
    {
        var cart = new CountedCarts();
        _cartRepo.Add(cart);

        return _cartRepo.GetTodaysCarts();
    }

    [HttpGet]
    [Route("Remove")]
    public string GetDecrement()
    {
        _cartRepo.RemoveLast();
        return _cartRepo.GetTodaysCarts();
    }


}

请注意,这些API调用在从Postman调用时按预期工作。

3 个答案:

答案 0 :(得分:6)

您不应该使用await with client.GetAsync,它由.Net平台管理,因为您当时只能发送一个请求。

就像这样使用它

var response = client.GetAsync("URL").Result;  // Blocking call!

            if (response.IsSuccessStatusCode)
            {
                // Parse the response body. Blocking!
                var dataObjects = response.Content.ReadAsAsync<object>().Result;

            }
            else
            {
                var result = $"{(int)response.StatusCode} ({response.ReasonPhrase})";
               // logger.WriteEntry(result, EventLogEntryType.Error, 40);
            }

答案 1 :(得分:5)

你正在采取一劳永逸的做法。在您的情况下,您需要等待结果。

例如,

static async Task<string> GetResponseFromURI(Uri u)
{
    var response = "";
    using (var client = new HttpClient())
    {
        HttpResponseMessage result = await client.GetAsync(u);
        if (result.IsSuccessStatusCode)
        {
            response = await result.Content.ReadAsStringAsync();
        }
    }
    return response;
}

static void Main(string[] args)
{
    var t = Task.Run(() => GetResponseFromURI(new Uri("http://www.google.com")));
    t.Wait();

    Console.WriteLine(t.Result);
    Console.ReadLine();
}

答案 2 :(得分:0)

使用httpclient时,我遇到了chace控件的问题。

HttpBaseProtocalFilter^ filter = ref new HttpBaseProtocolFilter();
filter->CacheControl->ReadBehavior = Windows::Web::Http::Filters::HttpCacheReadBehavior::MostRecent;
HttpClient^ httpClient = ref new HttpClient(filter);

我不确定预期的结果是什么,或者你得到什么结果,所以这真的只是一个猜谜游戏。

当我使用HttpClient发布内容时,我发现手动添加标题似乎比使用默认标题更常用。

auto httpClient = ref new HttpClient();
Windows::Web::Http::Headers::HttpMediaTypeHeaderValue^ type = ref new Windows::Web::http::Headers::HttpMediaTypeHeaderValue("application/json");
content->Headers->ContentType = type;

如果我不做我发现的这两件事,无论如何,我的网络请求的一半时间实际上并没有被发送或者标题都搞砸了,而另一半时间它完美地工作了。

我刚看了一条评论,你说它只会发射一次,这让我觉得它是缓存控制。我认为会发生什么事情(Windows?)看到发送的2个请求完全相同,所以为了加快速度,它只是采用相同的答案,而不是第二次实际发送请求