【问题标题】:Cannot use async/await in Sitefinity MVC Controller Actions无法在 Sitefinity MVC 控制器操作中使用异步/等待
【发布时间】:2017-10-08 02:35:31
【问题描述】:

我从Sitefinity forum 交叉发布这个问题,以收集尽可能多的策略。这个问题类似于this one,但我还是发布它是为了获得关于我们提出的哪些建议变通办法可能更适合的反馈。

Sitefinity 支持使用 MVC 控制器创建小部件。但是,这些控制器不能是异步的,也不能返回 Task。通常,这很好,因为我们通常会与具有非异步管理器的 Sitefinity 数据进行交互。

但是,在这种情况下,我们正在创建将显示来自 3rd 方 API 的数据的小部件,并使用 HttpClient 来获取该数据,并且这些操作是异步的。需要明确的是,这些是 server-to-server api 调用,不能直接通过客户端 ajax 调用来完成。

根据我已经能够研究和阅读的内容,流行的策略是用 WebClient 替换 HttpClient 并使调用同步(如建议的here)。这看起来很简单,但我担心这可能会影响性能,因为我们预计高峰时间会同时处理数百个甚至数千个用户,而且这些是购买交易,因此它们的性能尤其重要......

我能想到的唯一其他策略是使用 Angular 将网站的这一部分实现为 SPA,并在客户端完成所有操作。但是我们不想在客户端公开我们的 API 调用,所以我们必须构建一个代理以在服务器端传递它们,可能使用常规控制器(在 Sitefinity 中称为“经典”,一个不驱动小部件的)。

我们是否可以利用其他策略在不支持异步的控制器中进行异步调用?在这种情况下,您是否同意通过 WebClient 同步调用是更好的选择?如果不是,您建议有什么其他选项来解决此限制?

【问题讨论】:

  • 您可以在项目中实现自己的 WebApiControllers,同时利用 Sitefinity Content API 收集您需要在小部件上显示的 CMS 内容。
  • 感谢您的输入,如果我们只需要 SF 内容,这将正常工作,但这些小部件不适用于 SF 内容,它们用于我们必须通过 HTTP 调用 REST 获取的外部内容api,并且这些调用与 HttpClient 是异步的,因此我们无法从 Sitefinity MVC 小部件控制器的操作中进行此类调用,因为 Sitefinity 不支持异步操作。
  • 我明白这一点。从字面上看,您需要做的就是在项目的 VisualStudio 中创建一个 WebApiController。如果您不需要很好的 Sitefinity 内容,您仍然可以使用 HttpClient 调用外部 API(混淆来自客户端的 API 调用)。您可以毫无问题地将这些控制器操作标记为异步
  • 好的,是的,我明白了,但我不能使用这些控制器来创建小部件,这就是问题所在。如果您的意思是我可以从我的常规 sitefinity 小部件控制器中调用那些 WebApiControllers,我不会还有同样的问题吗?因为这些是异步的,我仍然必须从控制器中调用它们异步?如果您的意思是同步调用我的自定义 webapi 控制器,那么只使用 WebClient 直接使从小部件到 api 的 web 调用同步更有意义吗?
  • 你是对的,我正在制作将拖到页面上的小部件,但是 api 调用是从这些小部件的 服务器端 操作完成的,而不是通过客户端 ajax .如果它们是客户端 ajax 我们可以做到,但 api 调用是服务器到服务器

标签: c# asp.net-mvc asynchronous async-await sitefinity


【解决方案1】:

通常,异步方法的工作方式如下:

AsyncControllerActionInvoker 类调用的所有异步操作。

但这不适用于 sitefinity,因为 Telerik.Sitefinity.Mvc.ControllerActionInvoker(正在处理 mvc 小部件)是同步的。

我很确定其他限制可能不仅在“调用操作”级别,在更深的地方。我认为只有 Sitefinity 核心开发人员才能详细回答这个问题

【讨论】:

  • 谢谢你的图,这绝对是我理解的方式。似乎在支持异步的同时会在处理过程中释放一个线程,所以我只使用 WebClient 而不是 HttpClient 在我的小部件中为这些请求提供服务是安全的。如果 SF 添加了异步,我可以将 httpclient 换回去。我是否在性能方面自欺欺人?我的意思是这就是我们在异步之前多年的做法,对吧?
  • 是的,我很惊讶为什么 Progress 仍然没有实现 DataAccess ORM 的异步方法和 Sitefinity 的异步控制器。我想在你的情况下,你可以只使用 WebClient。当然会比异步 HttpClient 慢
猜你喜欢
  • 2023-03-08
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2012-12-07
  • 1970-01-01
  • 2012-10-14
相关资源
最近更新 更多