【发布时间】:2014-01-27 05:39:59
【问题描述】:
在 .NET 的上下文中...
对于我正在开发的 Web 应用程序,我有以下架构(从上到下,松散地说):
- Web 层中的 Web API 2.0 控制器
- 服务层(或多或少与控制器一对一;例如 ProjectsController 调用 ProjectsService)
- 存储库层,其中包含模型层和对 .NET RavenDB 客户端的引用
- DI 注入
- 控制器对服务层的所有调用都返回something:创建返回对象POST-ed;更新返回对象 PUT-ed;删除返回对象的副本删除等)
- 从客户端(浏览器中的 JavaScript)到 Web API 的所有调用都是 AJAX
现在特别关注一个控制器和两个服务,我有以下内容: 调用 ProjectsService (“PS”) 的 ProjectsController (“PC”),其中注入了 SmartyStreetsGeocodingService (“SSGS”),并且ProjectsService 调用。我最初将 SSGS 编写为同步服务只是为了测试目的。但现在是时候将 Smarty Streets RESTful API 的同步调用转换为异步调用了。我现在遇到了一个与同步性有关的时间问题,而且它处理得太快了。
我的问题确实与建筑有关。此外,我想保持在从同步转换为异步的范围内(我知道其他方法,例如 .NET 服务总线、SignalR 等,我稍后会介绍所有这些方法)。
究竟什么应该是异步的?
考虑 SSGS 中的以下代码:
using (var response = request.GetResponse() as HttpWebResponse)
{
if (response == null) return geocodingResult;
var jsonSerializer = new DataContractJsonSerializer(typeof(CandidateAddress[]));
var stream = response.GetResponseStream();
if (stream == null) return geocodingResult;
var objResponse = jsonSerializer.ReadObject(stream);
jsonResponse = objResponse as CandidateAddress[];
}
if (jsonResponse == null || jsonResponse.Length == 0) //<-- Executes too soon
{
geocodingResult.IsVerified = false;
return geocodingResult;
}
geocodingResult.IsVerified = true;
上面的片段是我希望转换为异步的,因为紧跟在 using 语句之后的代码部分执行得太快了。但这会引发一些问题:
- 当我转换为异步时,究竟什么应该是异步的?
- 只是调用 SSGS 所在的方法?
- PS 本身是否应该对 SSGS 进行异步调用?
- PC 是否也需要异步?
- 从 PC 到 PS 的调用应该是异步的吗?
谢谢。
【问题讨论】:
标签: c# .net rest asynchronous asp.net-web-api