繁体   English   中英

ASP.NET中的异步RouteBase与GetRouteDataAsync和GetVirtualPathAsync?

[英]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管道中是否有我可以自己创建的地方?

我正在使用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的。 我认为你最好的选择是拥有一个asyncoverride方法,并从非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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM