![](/img/trans.png)
[英]Asp.net 3.5 url routing and winforms not working after publishing
[英]ASP.NET 3.5 Url Routing Not Working
我是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");
}
}
我收到以下错误
路由处理程序“ RouteHandler”没有从其
GetHttpHandler()
方法返回IHttpHandler
。
我尝试了100个链接,但无法找出问题所在。
如果有人在asp.net 3.5中具有URL路由方面的经验。.....pls帮助....我需要非常紧急地实施它。
提前致谢....
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。
我发现的另一个有用事实是,没有充分记录的事实是,您喂给Route
构造函数的路径模式是相对于应用程序的,而不是相对于主机的,并且它不应以“ /”或“〜/”开头。 只需从第一个子文件夹名称开始,如果在应用程序根级别,则从页面名称开始。
您必须获得所有正确的权限,才能使其调用IRouteHandler
。 然后,您可以担心两个上下文的问题(如果有)。 我毫不费力地在处理程序类中写入requestContext.HttpContext.Items
,然后从目标页面的Context.Items
中读取。
但是,由于收到错误消息“没有从其GetHttpHandler()返回IHttpHandler”,听起来您至少已经在桌面上正常工作了。 因此,问题是……为什么将页面实例强制转换为IDisplay而不是IHttpHandler? 这似乎是显而易见的第一件事。 我尝试将返回值强制转换为Page,并且似乎只想直接将其强制转换为IHttpHandler。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.