В очередной раз был подобный вопрос на форумах, а поскольку данный вопрос попадается мне не в первый раз, то я решил написать эту статью.
Хотя назвать статьей не особо язык поворачивается. Всё реализуется достаточно просто, если хорошо представлять себе механизм обработки запросов в ASP.NET. Можно конечно напридумать много разных способов с использованием модулей перезаписи путей и прочего, но раз есть такая мощная система как маршрутизация, то будет грех её не использовать. Сначала нужно зарегистрировать наш маршрут.
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Add(new Route("Some/{*extrainfo}", new MyRouteHandler()));
}
}
Маршруты начинающиеся с Some будут передаваться обработчику маршрутов MyHandler. Его определяем мы.
namespace TestHttpHandler
{
public class MyRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MyHttpHandler();
}
}
}
А сам обработчик маршрутов сопоставит их обработчику HTTP-данных, который и является конечной точкой обработки запросов.
namespace TestHttpHandler
{
/// <summary>
/// Summary description for MyHttpHandler
/// </summary>
public class MyHttpHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
В данном примере я использовал готовый обработчик ashx предлагаемый студией, но им может быть любой класс при условии, что он реализует интерфейс IHttpHandler. Теперь все маршруты подобные этим
/Some
/Some/Some
/Some/Some/Some
будут обработаны только нашим обработчиком HTTP-данных. Как видно всё очень просто.