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