我有一个自定义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管道中有没有可以自己创建的地方?
我使用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管道将需要大量的工作,但是您可以轻松地忽略并从这里服务您的响应.您可以在其中使用控制器工厂,并创建您的方法来执行您需要的.