Создание асинхронных HTTP-обработчиков

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

При обработке различных запросов есть смысл сделать обработчики асинхронными, например, когда речь идет о получении данных из бд или от внешнего ресурса.

Асинхронные обработчики отличаются от синхронных тем, что класс обработчика наследуется от класса HttpTaskAsyncHandler.

Итак, создадим новый класс UserInfoAsyncHandler:

public class UserInfoAsyncHandler : HttpTaskAsyncHandler
{
    public override async Task ProcessRequestAsync(HttpContext context)
    {
        string idString = context.Request.Url.Segments[2];
        int id;
        Int32.TryParse(idString, out id);
        User user;
        string result = "";
        using(UserContext db = new UserContext())
        {
            user = await db.Users.FindAsync(id);
        }
        if(user!=null)
        {
            result += "<p>Id=" + user.Id.ToString() +" Name: " + user.Name+"</p>";
        }
        context.Response.Write(result);
    }
}

В данном случае мы получаем третий сегмент строки запроса, который должен содержать id нужной нам записи. И получив id, выводим из базы данных соответствующие ему данные.

Также зарегистрируем новый маршрут, запросы по которому будут обрабатываться данным обработчиком, в файле RouteConfig.cs:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.Add(new Route("User/{id}", new CustomRouteHandler()));
        
		routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}
class CustomRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new UserInfoAsyncHandler();
    }
}

Новый маршрут будет соответствовать запросам типа http://localhost:8989/user/1, где последний сегмент будет извлекаться обработчиком и использоваться для получения информации из базы данных.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850