使用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调用时按预期工作。
答案 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个请求完全相同,所以为了加快速度,它只是采用相同的答案,而不是第二次实际发送请求