c# – ASP.NET中的Async RouteBase与GetRouteDataAsync和GetVirt
发布时间:2020-12-15 06:32:15 所属栏目:百科 来源:网络整理
导读:我有一个自定义ASP.NET路由,其中??有IO操作.现在,假设这些IO操作无法缓存(即太大). 在某种程度上,我正在寻找一个AsyncRouteBase类 public async override TaskRouteData GetRouteDataAsync(HttpContextBase httpContext)public async override TaskVirtualPa
我有一个自定义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,而是可以创建Async Route Handler. 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中的各自的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |