ASP.NET 3.5 网址路由不起作用

本文关键字:路由 不起作用 NET ASP | 更新日期: 2023-09-27 18:18:40

我是 asp.net 领域的新手,并且在 asp.net 3.5中实现url路由时遇到了一些问题(我知道它可以在 asp.net 4.0中轻松实现(。

这是我所做的.....

a( 我正在使用 .NET Framework 3.5 SP1。

b( 在web.config中添加System.Web.Routing程序集引用

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

我收到以下错误

路由处理程序

"路由处理程序"未返回IHttpHandler 从其GetHttpHandler()方法。

我尝试了 100 个链接,但无法找出问题所在。

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

提前谢谢....

ASP.NET 3.5 网址路由不起作用

System.Web.Routing 

仅在 .NET Framework 版本 4 上可用

这可能太少,太晚了,但我最近升级了一个 .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");
    }
}
我一直

在为同样的问题而苦苦挣扎,这是我学到的一件事。 在 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 不同的 web.config。

我发现的另一个有用的事实没有很好的记录是,你提供给Route构造函数的路径模式是相对于应用程序的,而不是相对于主机的,它不应该以前导"/"或"~/"开头。 只需从第一个子文件夹名称或页面名称(如果在应用根级别(开始。

您必须正确处理所有内容才能使其能够调用您的IRouteHandler。 然后,您可以担心两个上下文问题(如果有的话(。 我在处理程序类中写入requestContext.HttpContext.Items然后从目标页面中的Context.Items读取没有问题。

但是,由于您收到错误消息"未从其GetHttpHandler((返回IHttpHandler",因此听起来您至少可以在桌面上工作。 那么问题来了...为什么将页面实例转换为 IDisplay 而不是 IHttpHandler? 这似乎是显而易见的第一件事。 我尝试将返回转换为 Page,它似乎只想直接转换为 IHttpHandler。