ASP.NET 3.5 Url Routing не работает - PullRequest
2 голосов
/ 24 декабря 2011

Я новичок в поле asp.net и у меня возникли проблемы с реализацией маршрутизации URL в asp.net 3.5 (я знаю, что это легко реализовать в asp.net 4.0).

Вот что я сделал .....

a) Я использую .NET Framework 3.5 SP1.

b) Добавлена ​​System.Web.Routing ссылка на сборку в web.config

<assemblies>
   <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, 
PublicKeyToken=31BF3856AD364E35"/>
</assemblies>

c) Добавьте UrlRoutingModule модуль HTTP

<httpModules>
<add name="RoutingModule" 
     type="System.Web.Routing.UrlRoutingModule, System.Web.Routing,
         Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>

г) Код в Global.asax

 void Application_Start(object sender, EventArgs e) 
 {

    RegisterRoutes();
 }

 private static void RegisterRoutes()
 {
    System.Web.Routing.RouteTable.Routes.Add(
            "SaveUser", new System.Web.Routing.Route("SaveUser",
                                new RouteHandler("~/Register.aspx")));

 }

е) RouteHandler.cs Класс

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Web;
 using System.Web.Routing;
 using System.Web.Compilation;
 using System.Web.UI;

 public class RouteHandler : IRouteHandler
 {
   public RouteHandler()
   {
   }

   public RouteHandler(string virtualPath)
   {
      _virtualPath = virtualPath;
   }

   public IHttpHandler GetHttpHandler(RequestContext requestContext)
   {
       //var display = BuildManager.CreateInstanceFromVirtualPath(
       //                _virtualPath, typeof(Page)) as IDisplay;
       var abc = BuildManager.CreateInstanceFromVirtualPath(_virtualPath, typeof(Page)) as IDisplay;
       return abc;
   }

   string _virtualPath;
}

е) код в Default.aspx.cs

 using System;
 using System.Configuration;
 using System.Data;
 using System.Linq;
 using System.Web;
 using System.Web.Security;
 using System.Web.UI;
 using System.Web.UI.HtmlControls;
 using System.Web.UI.WebControls;
 using System.Web.UI.WebControls.WebParts;
 using System.Xml.Linq;

 public partial class _Default : System.Web.UI.Page 
 {
   protected void Page_Load(object sender, EventArgs e)
   {
      Response.Redirect("~/SaveUser");
   }
 }

и я получаю следующую ошибку

Обработчик маршрута 'RouteHandler' не вернул IHttpHandler из его GetHttpHandler() метода.

Я перепробовал 100 ссылок, но не смог разобрать, что не так.

Если у кого-то есть опыт в маршрутизации URL-адресов в asp.net 3.5 ..... просьба помочь .... Мне нужно срочно реализовать это ....

Заранее спасибо ....

Ответы [ 3 ]

1 голос
/ 19 декабря 2013
System.Web.Routing 

доступно только для .net Framework версии 4

0 голосов
/ 21 сентября 2015

Я боролся с этой же проблемой, и вот чему я научился. На странице, на которую ссылается Рик Шотт, написано, что то, что вы помещаете в web.config, зависит от того, какую версию IIS вы развертываете. Используйте это для IIS 6 или IIS 7 в «классическом режиме»:

<httpModules>
  <add name="UrlRoutingModule" 
       type="System.Web.Routing.UrlRoutingModule, 
             System.Web.Routing, 
             Version=3.5.0.0, 
             Culture=neutral, 
             PublicKeyToken=31BF3856AD364E35"/>
</httpModules>

... но в IIS 7+ "интегрированный режим" добавьте это вместо:

<system.webServer>
  <modules>
    <remove name="UrlRoutingModule" />
    <add name="UrlRoutingModule" 
         type="System.Web.Routing.UrlRoutingModule, 
               System.Web.Routing, 
               Version=3.5.0.0, 
               Culture=neutral, 
               PublicKeyToken=31BF3856AD364E35"/>
  </modules>
</system.webServer>

Одна важная вещь, которую я обнаружил, заключается в том, что, хотя последний может быть тем, что подходит для вашего IIS, первый - то, что работает в Visual Studio 2008. Поэтому вам, возможно, придется развернуть другой файл web.config из того, который вы разрабатываете с помощью .

Еще один полезный факт, который я обнаружил и который недостаточно хорошо задокументирован, заключается в том, что шаблон пути, который вы передаете в конструктор Route, является относительным к приложению, а не относящимся к хосту, и он не должен начинаться с ведущего "/". или "~ /". Просто начните с имени первой подпапки или имени страницы, если оно находится на корневом уровне приложения.

Вы должны получить все это право только для того, чтобы оно могло вызвать ваш IRouteHandler. Тогда вы можете беспокоиться о проблеме двух контекстов, если таковые имеются. У меня не было проблем с записью requestContext.HttpContext.Items в классе обработчика и последующим чтением с Context.Items на целевой странице.

Но так как вы получили сообщение об ошибке «не вернул IHttpHandler из его GetHttpHandler ()», похоже, что это работает, по крайней мере, на вашем рабочем столе. Тогда возникает вопрос: почему вы преобразуете свой экземпляр страницы как IDisplay, а не как IHttpHandler? Это кажется очевидным первым, что нужно изменить. Я попытался привести возвращение как Page, и вместо этого, похоже, просто требуется прямое приведение к IHttpHandler.

0 голосов
/ 08 февраля 2015

Возможно, это слишком мало, слишком поздно, но я недавно обновил сайт ASP.NET 3.5. Для использования маршрутизации и вижу вашу проблему.

Проблема заключается в том, что при настройке модуля маршрутизациион создает второй контекст для модуля маршрутизации, который полностью отделен от HttpContext.Current на странице ASP.NET.Итак, вам нужно настроить ваш обработчик так, чтобы вы могли получить доступ к этому другому экземпляру контекста (который является RequestContext).

public class RouteHandler : IRouteHandler
{
    public RouteHandler()
    {
    }

    public RouteHandler(string virtualPath)
    {
      _virtualPath = virtualPath;
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        //Record the request context of the routing module in HttpContext.Current, so we can use it in pages.
        HttpContext.Current.Items("requestContext") = requestContext
        return BuildManager.CreateInstanceFromVirtualPath(_virtualPath, typeof(Page)) as IDisplay;
    }

    string _virtualPath;
}

Теперь на странице вам нужен доступ к контексту из HttpContext.Current.Items.

public partial class _Default : System.Web.UI.Page 
{
    private readonly RequestContext RequestContext
    {
        get { return (RequestContext)HttpContext.Current.Items("requestContext"); }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        RequestContext.HttpContext.Response.Redirect("~/SaveUser");
    }
}
...