c# - 我应该如何使用不允许异步 Controller 操作的 CMS 处理异步 API 调用?

标签 c# asp.net-mvc asynchronous asp.net-web-api sitefinity

我已经开始使用 async/await 了,我读过的大部分内容都声明“不要阻止异步代码”,但控制台应用程序中的 main 函数除外。我发现自己无法遵循这个简单的规则:(

我的应用程序严重依赖于 WebAPI 层。我在 MVC 应用程序中使用的客户端正在使用 System.Net.Http.HttpClient 上的异步方法来调用 API 方法。目前我有两种处理方式。在某些地方,我们在调用客户后立即得到结果:

//WebAPI Client
public object GetSomething(int id)
{
    var task = _client_GetSomethingFromApiAsync(id);
    var result = task.Result;
    return result;
}

在其他情况下,一直使用异步直到 Controller 。我正在使用 SiteFinity 并且无法使用异步 Controller 操作,因此我最终得到如下结果:

//WebAPI Client
public Task<object> GetSomethingAsync(int id)
{
    return _client_GetSomethingFromApiAsync(id);    
}

//Domain Service
public Task<object> GetSomethingDomainServiceAsync(int id)
{
    return _service.GetSomethingAsync(id);  
}

//Controller
public JsonResult GetSomethingControllerAction(int id)
{
    var result = _domainService.GetSomethingDomainServiceAsync(viewModel.id).Result;
    return Json(new { Success = true, Payload = result });
}

根据我的研究,这两种解决方案都不理想,尽管我没有遇到任何死锁问题并且一切似乎都正常。有人可以帮助我理解我应该遵循的最佳模式并解释原因吗?

谢谢!

最佳答案

I am using SiteFinity and cannot use async controller actions

According to SiteFinity ,它确实支持异步 Controller 操作,但不支持小部件中的异步操作。如果这是您的情况,我鼓励您 vote .

假设您处于这种情况 - 并且无法使用异步代码 - 那么我建议您始终使用同步代码。也就是说,将 HttpClient 替换为 WebClient 或类似的内容。我不建议使用 Result,因为即使您的代码今天没有死锁,将来对 HttpClient 的更新也有可能(不太可能,但有可能)导致死锁。

如果您不想失去在async中已经进行的投资,那么我建议使用“ bool 参数黑客”,如我的文章 brownfield async 中所述。 .

关于c# - 我应该如何使用不允许异步 Controller 操作的 CMS 处理异步 API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657257/

相关文章:

c# - HibernateException : Could not create the driver from NHibernate. 驱动程序.MySqlDataDriver

c# - 清除 __eventArgument

Html 助手 LabelFor 不呈现标题(工具提示)

asynchronous - 从 Dart 中的构造函数调用异步方法

c# - 为 BackgroundWorker 设计接口(interface)

c# - Azure 事件中心 - 同一事件中心中的多种事件类型

asp.net-mvc - 如何在 View 中获取路由值

c# - Azure AD 签名 key 滚动更新

javascript - Nuxt.js:未定义 ReferenceError baseURL

javascript - 异步/同步 : how can I be sure a Javascript function will execute after the for loop?