ASP.NET 3.5 URL路由不起作用

时间:2011-12-24 11:13:50

标签: c# asp.net .net url-routing asp.net-mvc-routing

我是asp.net领域的新手,在asp.net 3.5中实现url路由时遇到一些问题(我知道它可以在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>

d)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")));

 }

e)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;
}

f)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个链接,但无法弄清楚是什么问题。

如果有人在asp.net 3.5中有url路由的经验.....请帮助....我需要非常紧急地实现它....

提前致谢....

3 个答案:

答案 0 :(得分:1)

System.Web.Routing 

仅适用于.net framework version 4

答案 1 :(得分:0)

这可能太少,太晚了,但我最近升级了一个.NET 3.5 ASP.NET站点以使用路由,我看到了你的问题。

问题在于,当您配置路由模块时,它会为路由模块创建第二个上下文,该上下文与ASP.NET页面中的HttpContext.Current完全分开。因此,您需要设置处理程序,以便可以访问此其他上下文实例(恰好是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");
    }
}

答案 2 :(得分:0)

我一直在努力解决同样的问题,这是我学到的一件事。在Rick Schott引用的页面上,它说你放在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构造函数的路径模式是app-relative,而不是host-relative,它不应该以一个前导“ /“或”〜/“。只需从第一个子文件夹名称开始,或者在应用程序根级别开始使用页面名称。

你必须完全正确,才能让它调用你的IRouteHandler。然后你可以担心双上下文问题,如果有的话。我在处理程序类中写入requestContext.HttpContext.Items然后从目标页面中的Context.Items读取时没有任何问题。

但是,由于您收到错误消息“未从其GetHttpHandler()返回IHttpHandler”,听起来您至少在​​桌面上工作了。那么接下来的问题是......为什么要将页面实例转换为IDisplay而不是IHttpHandler?这似乎是改变的首要问题。我尝试将返回转换为Page,而它似乎只是希望直接转换为IHttpHandler。