我正在使用HttpClient尝试在Web API控制器中执行POST方法.控制器方法是同步的.我是这样做的:
var response = owin.HttpClient.PostAsJsonAsync(uri,body);
在那之后我打电话给Wait:
var result = response.Wait(15000);
运行此代码时,我看到http结束执行,但结果值始终为false.我能错过什么?
编辑:
我现在尝试了异步方法,但它也没有帮助我
public IHttpActionResult Add(Item item) { var result = _db.AddItem(item); return Ok(result); }
测试项目:
TestServer _owinTestServer; public async Task<HttpResponse message> Method1(string url,object body) { return await _owinTestServer.HttpClient.PostAsJsonAsync(url,body); } public async Task<ItemPreview> Method2(object body); { return await Method1("..",body ).Result.Content.ReadAsAsync<ItemPreview>(); } [TestMethod] public void test1() { Item item = new(...); Method2(item).Continue with(task => {// Never reach here } }
我究竟做错了什么?
在调试时,我看到控制器方法返回了一个很好的响应,但它永远不会回到我的测试
解决方法
您正在混合异步和阻塞调用(即.Result,.Wait()),这会导致死锁.
这看起来更像是测试客户端的阻塞问题.
如果要等待服务器的结果,则需要在此情况下始终使测试异步.
将测试方法转换为异步
[TestMethod] public async Task test1() { //Arrange Item item = new Item(...); //Act var preview = await Method2(item); //Assert Assert.IsNotNull(preview); }
如果在调用之后没有使用任务,则Method1不需要asyn / await,因此可以将其删除并让方法返回可以等待的任务
TestServer _owinTestServer; public Task<HttpResponse> Method1(string url,object body) { return _owinTestServer.HttpClient.PostAsJsonAsync(url,body); }
Method2需要等待Method1的响应,然后获取其内容.
public async Task<ItemPreview> Method2(object body) { var response = await Method1("..",body ); return await response.Content.ReadAsAsync<ItemPreview>(); }