我正在构建一个类API来与API进行交互.我需要调用API并处理XML响应.我可以看到HttpClient用于异步连接的好处,但我正在做的是纯粹的同步,所以我看不到使用它的任何重大好处HttpWebRequest.
如果有人可以放弃任何光线,我将非常感激.我不是为了它而使用新技术的人.
在ASP.NET Web API 2中,以下内容有何区别?
public async Task<IEnumerable<MyItem>> GetMyItems()
{
//... code ..., var myItems = await ...
return myItems;
}
Run Code Online (Sandbox Code Playgroud)
和
public async Task<IQueryable<MyItem>> GetMyItems()
{
//... code ..., var myItems = await ...
return myItems;
}
Run Code Online (Sandbox Code Playgroud)
和
public async Task<IHttpActionResult> GetMyItems()
{
//... code ..., var myItems = await ...
return Ok(myItems);
}
Run Code Online (Sandbox Code Playgroud)
我应该退货IHttpActionResult还是IEnumerable<MyItem>/ IQueryable<MyItem>?
我有.NET核心Web API作为服务层.服务层具有所有EF代码.
如果有basecontroller与此代码
protected Task<IActionResult> NewTask(Func<IActionResult> callback)
{
return Task.Factory.StartNew(() =>
{
try
{
return callback();
}
catch (Exception ex)
{
Logger.LogError(ex.ToString());
throw;
}
});
}
Run Code Online (Sandbox Code Playgroud)
在控制器操作中,我将上述方法中的所有调用包装到例如:
[HttpGet("something")]
public async Task<IActionResult> GetSomething(int somethingId)
{
return await NewTask(() =>
{
var result = _somethingService.GetSomething(somethingId);
if (result != null)
return Ok(result);
else
return NotFound("Role not found");
});
}
Run Code Online (Sandbox Code Playgroud)
这是正确的模式,考虑到明天,我可能有多个服务呼叫在行动或拨打其他Web服务.请指教.
我一直听说使用异步编程模式会让我的代码运行得更快.为什么这是真的?不管是现在运行还是以后运行,都不能以相同的方式运行相同的代码?
我的目标是提高我正在开发的Web API的可伸缩性。为此,我将控制器动作实现为async。想法是释放请求线程并可以处理其他传入请求。但是,各州的成功答案是Effectively use async/await with ASP.NET Web API:
您需要一个真正的异步实现来获得异步的可伸缩性优势。
最终,我的代码需要从第三方库中调用非常同步,单线程和I / O绑定的方法。因此,真正做到这一点的唯一方法是通过Task.Run(),我认为它将保留在线程上-从而取消了异步/等待的好处。
那么,当混合操作中存在同步操作时,是否有一种方法可以在Web API方案中实现异步/等待的好处?