Как вызвать обработчик * .ashx в asp.net 4.0 Routing - PullRequest
1 голос
/ 27 июля 2011

Я работаю в ASP.net 4.0 с сайтом маршрутизации, а не в MVC Architecture. Здесь у меня большая проблема, то есть я не могу вызвать какой-либо файл обработчика при маршрутизации.

Я пишу этот код на странице global.asax

public static void RegisterRoutes(System.Web.Routing.RouteCollection routes)
    {
        routes.Add(new System.Web.Routing.Route("{language}/{*page}", new CustomRouteHandler()));
    }

    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(System.Web.Routing.RouteTable.Routes);
    }

и в классе CustomRouteHandler

    public class CustomRouteHandler : IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string language = TemplateControlExtension.GetString(null, requestContext.RouteData.Values["language"]).ToLower();
        string page = TemplateControlExtension.GetString(null, requestContext.RouteData.Values["page"]).ToLower();

        if (string.IsNullOrEmpty(page))
        {
            HttpContext.Current.Response.Redirect("/" + language + "/default.aspx");
        }

        string VirtualPath = "~/" + page;

        if (language != null)
        {
            TemplateControlExtension.Language = language;
        }

        return BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;
    }
}

Когда я вызываю любой файл обработчика на этом сайте, он выдает ошибку, т.е.

Type 'Captcha' does not inherit from 'System.Web.UI.Page'.

Мой вопрос заключается в том, как мы можем вызывать файлы обработчиков на этом сайте ??

Какая модификация хочет этот код маршрута ??

1 Ответ

2 голосов
/ 27 июля 2011

Используйте этот код

using System.Web;
using System.Web.Compilation;
using System.Web.Routing;

public class HttpHandlerRouteHandler<T> : IRouteHandler where T : IHttpHandler, new() {

  public HttpHandlerRouteHandler() { }

  public IHttpHandler GetHttpHandler(RequestContext requestContext) {
    return new T();
  }
}

public class HttpHandlerRouteHandler : IRouteHandler {

  private string _VirtualPath;

  public HttpHandlerRouteHandler(string virtualPath) {
    this._VirtualPath = virtualPath;
  }

  public IHttpHandler GetHttpHandler(RequestContext requestContext) {
    return (IHttpHandler) BuildManager.CreateInstanceFromVirtualPath(this._VirtualPath, typeof(IHttpHandler));
  }

}
...