【发布时间】: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