【发布时间】:2017-10-28 09:59:46
【问题描述】:
我正在开发一个将使用 Asp Net Web Api 的 Asp Net MVC 客户端。我必须决定如何更好地设计我的应用程序。在网上搜索了一段时间后,我发现有人建议(例如,here)使 MVC 操作方法异步。我还发现使用异步操作方法的主要好处是服务器的可扩展性,即服务器将能够处理更多请求。不过有一件事,我正在使用的 web api 具有同步操作方法,并且将在同一台服务器上运行。所以我的猜测是为我的 MVC 实现异步操作方法对我没有任何好处,因为即使我的 MVC 操作方法是异步的,并且服务器最终将能够从“MVC 的角度”扩展这些方法将仍然使用同步的 Web Api 方法,因此,服务器将“不可避免地”耗尽其线程池。也许我遗漏了一些东西,或者异步操作方法还有其他一些好处?
这是我编写的一个非常简单的示例代码,旨在让您更好地理解我的问题:
这是 web api 控制器:
public class UsersController : ApiController
{
private readonly IUserService _userService;
public UsersController(IUserService userService)
{
_userService = userService;
}
// As you can see this method is not asynchronous
public User Get(int id)
{
return _userService.GetUserById(id);
}
// some other code
}
这是 Mvc 控制器,我有两种选择如何设计我的动作方法:
public class UsersController : Controller
{
// A) Make simple synchronous action methods
public ActionResult UserPageSync()
{
IUserWebServiceSync userWebServiceSync = new UserWebServiceSync();
User user = userWebServiceSync.GetUserById(1);
return View();
}
// B) Make asynchronous action methods
public async Task<ActionResult> UserPageAsync()
{
IUserWebServiceAsync userWebServiceAsync = new UserWebServiceAsync();
User user = await userWebServiceAsync.GetUserByIdAsync(1);
return View();
}
}
【问题讨论】:
-
拥有异步和同步方法很好。在您担心它之前,我会等到您的应用程序性能出现问题。拥有大量异步方法意味着,例如,当您的应用程序转到数据库以获取一些信息时,它会比您的方法是同步的更快地将请求连续发送到您的数据库。这意味着它使您的数据源成为瓶颈,而不是您的实际应用程序。我建议看看它是如何进行的,如果你遇到问题,分析你的应用程序,并根据具体情况决定最好的前进方式。
-
@Luke 您是否暗示如果我在 mvc 操作方法中调用 web api 两次或更多次,如果方法是异步的,请求将更快发送?你觉得现在让它们异步还是同步更好?
-
我认为您可能会混淆 WebAPI 是什么,您不会从操作方法调用 WebAPI。您的网页可能会通过 Javascript 调用 WebAPI。是的,如果您的 WebAPI 方法在调用堆栈中一直定义为异步,包括异步数据库调用,那么如果此方法被快速连续调用两次,则 UI 绑定线程将被释放以供其他调用者使用,所以是的从理论上讲,对您的数据库的调用不太可能因缺少线程而被阻塞,因此它们会根据负载更快地访问您的数据库。
-
我的整个网站都是同步的,当我的网站负载时我没有任何问题,我只是扩展我的网站资源以满足需求。我发现扩展我的 Web 服务器比扩展我的数据库更容易,所以我很高兴我的调用是同步的,因此在严重负载下它不会破坏我的数据库。我还没有发现需要使用异步方法,而且我的网站获得了数百万次点击。你的点击量会达到数百万吗? :P
-
如何从 JavaScript 调用 WebAPI 是一个糟糕的策略?在您的操作方法中使用 HttpClient 调用 WebAPI 非常奇怪。当您可以直接调用逻辑时,是否有理由需要这样做?
标签: asp.net-mvc asynchronous asp.net-web-api async-await threadpool