c# – ASP.NET中的Async RouteBase与GetRouteDataAsync和GetVirtualPathAsync?

前端之家收集整理的这篇文章主要介绍了c# – ASP.NET中的Async RouteBase与GetRouteDataAsync和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,而是可以创建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中的各自的方法.

猜你在找的C#相关文章