C# 自定义模型绑定器是否可以设置为异步?

C# 自定义模型绑定器是否可以设置为异步?,c#,asp.net-web-api,asp.net-web-api2,C#,Asp.net Web Api,Asp.net Web Api2,我有一个需要访问数据库的自定义模型绑定器。我可以同步执行,但我希望异步执行 public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { var json = actionContext.Request.Content.ReadAsStringAsync().Result; // nothing to see here Truck truck = JsonC

我有一个需要访问数据库的自定义模型绑定器。我可以同步执行,但我希望异步执行

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
    var json = actionContext.Request.Content.ReadAsStringAsync().Result; // nothing to see here
    Truck truck = JsonConvert.DeserializeObject<Truck>(json);
    truck.Availability = await _truckRepo.GetAvailability(truck.Id); // <-- problem. BindModel is a synchronous method
}

假设数据库调用需要很长时间(idk说是三秒),那么这样做对我有什么好处吗

您仍然会有一个专用线程等待结果和async/await的开销。从逻辑上讲,更好的选择是添加
System.Web.Http.Filters.ActionFilterAttribute
类型,以丰富实例(如果这是公共代码(重用代码))。这确实允许异步,您可以添加一个名为GetAvailabilityAttribute的筛选器类型。您正在使模型绑定机制执行它从未打算执行的操作。它的发明(据我所知)考虑到的是相对简单的事情,比如字符串到日期时间的转换,而不是动态的数据访问。如果输入语法错误,ModelBinding可以进行语法验证并将
ModelState.IsValid
设置为
false
。让它实际检索数据在我看来太过分了。您仍然会有一个专用线程等待结果和async/await的开销。逻辑上更好的选择是添加
System.Web.Http.Filters.ActionFilterAttribute
类型,以丰富实例(如果这是公共代码(重用代码))。这确实允许异步,您可以添加一个名为GetAvailabilityAttribute的筛选器类型。您正在使模型绑定机制执行它从未打算执行的操作。它的发明(据我所知)考虑到的是相对简单的事情,比如字符串到日期时间的转换,而不是动态的数据访问。如果输入语法错误,ModelBinding可以进行语法验证并将
ModelState.IsValid
设置为
false
。让它实际检索数据在我看来太过分了。
var success = Task.Run(async () =>
{
    var json = await actionContext.Request.Content.ReadAsStringAsync();
    Truck truck = JsonConvert.DeserializeObject<Truck>(json);
    truck.Availability = await _truckRepo.GetAvailability(truck.Id);
    return true;
}).Result;