[英]Async RouteBase in ASP.NET with GetRouteDataAsync and GetVirtualPathAsync?
我有一个自定义ASP.NET路由,其中包含IO操作。 现在,假设这些IO操作无法缓存(即太大)。
在某种程度上,我正在寻找一个AsyncRouteBase
类
public async override Task<RouteData> GetRouteDataAsync(HttpContextBase httpContext)
public async override Task<VirtualPathData> GetVirtualPathAsync(RequestContext requestContext, RouteValueDictionary routeValues);
我正在使用ASP.NET MVC 5.2.3.0
您无法创建AsyncRouteBase,因为ASP.NET MVC使用的路由是同步的。 你必须明白,为了你创建异步方法,有人必须异步使用它们,你不能通过添加异步方法神奇地使所有异步。
由于各种原因,路由不能异步,路由被缓存,并且仅在执行第一个请求时创建一次。 请注意,路由缓存,它们不会更改,并且它们不能在运行时更改,因为它们首先执行,如果路由将进行异步数据库调用,则每个请求都必须等待路由条件满足,这将减慢整个应用程序。
而且您大多不需要AsyncRouteBase,而是可以创建异步路由处理程序。
public class AsyncRouteHandler : IRouteHandler
{
IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)
{
return new AsyncHttpHandler();
}
}
public class AsyncHttpHandler : HttpTaskAsyncHandler{
public override async Task ProcessRequestAsync(HttpContext context)
{
}
}
但是,在其中使用MVC管道需要大量工作,但您可以轻松忽略它并从此处为您的响应提供服务。 您可以在其中使用控制器工厂并创建您的方法来执行您需要的操作。
另一种方法是轻松使用MEF或其他形式的DI来管理更大的代码库并调用AsyncHttpHandler中的相应方法。
不幸的是,有没有办法来覆盖非async
方法与async
的。 我认为你最好的选择是拥有一个async
非override
方法,并从非async
方法调用,如:
public override RouteData GetRouteData(HttpContextBase httpContext) {
return GetRouteDataAsync(httpContext);
//return await GetRouteDataAsync(httpContext);
}
public async override Task<RouteData> GetRouteDataAsync(HttpContextBase httpContext){
//operations here
}
注意 :这可能会导致问题。 如果原始代码没有期望任何async
代码执行,那么引入这种模式可能会打破期望。 尽可能避免使用它。
作为建议,请参阅使用任务简化异步编程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.