我需要在现有的asp.net应用程序中进行路由 - 不是asp.net mvc(是的,我知道我应该转换但是现在说它不可能所以不要告诉我:)) - 我怎么能路由到普通类而不是aspx页面,因为我看到的所有示例代码总是与aspx页面一样:
http://msdn.microsoft.com/en-us/magazine/dd347546.aspx
准确地说,我想在MVC控制器路由中做一些事情:例如产品的控制器是您通过http://domain.com/product
访问的纯类答案 0 :(得分:5)
ASP.NET MVC和ASP.NET Web Forms共享相同的路由基础结构,因为两个框架最终都需要提供IHttpHandler
来处理HTTP请求:
IHttpHandler接口自从成为ASP.NET的一部分 开始,Web表单(System.Web.UI.Page)是IHttpHandler。
(来自问题中链接的MSDN文章)
在ASP.NET MVC中,使用System.Web.Mvc.MvcHandler
类which then delegates to a controller来进一步处理请求。在ASP.NET Web窗体中,通常使用表示.aspx文件的System.Web.UI.Page
类,但也可以使用与.ashx文件关联的纯 IHttpHandler
。
因此,您可以路由到.ashx处理程序,作为.aspx Web窗体页面的替代方法。两者都实现了IHttpHandler
(和MvcHandler
一样),但是前者就是它所做的一切。这就像你可以得到处理(路由)请求的“纯类”一样接近。由于处理程序部分只是一个接口,因此您可以自由地继承自己的类。
<%@ WebHandler Language="C#" Class="LightweightHandler" %>
using System.Web;
public class LightweightHandler : YourBaseClass, IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("Hello world!");
}
public bool IsReusable { get { return false; } }
}
请注意,IRouteHandler
只需要返回IHttpHandler
的实例:
public IHttpHandler GetHttpHandler(RequestContext requestContext);
如果您使用.ashx文件,则可能需要跳过一些箍来使用BuildManager *来实例化您的处理程序。如果没有,您可以新建一个类的实例并将其返回:
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
// In case of an .ashx file, otherwise just new up an instance of a class here
IHttpHandler handler =
BuildManager.CreateInstanceFromVirtualPath(path, typeof(IHttpHandler)) as IHttpHandler;
// Cast to your base class in order to make it work for you
YourBaseClass instance = handler as YourBaseClass;
instance.Setting = 42;
instance.DoWork();
// But return it as an IHttpHandler still, as it needs to do ProcessRequest
return handler;
}
请参阅此问题的答案,以便对路由纯IHttpHandler进行更深入的分析:Can ASP.NET Routing be used to create “clean” URLs for .ashx (IHttpHander) handlers?
**我不完全确定BuildManager的例子,如果我错了那个,请有人纠正我*
答案 1 :(得分:2)
如果您无法切换到ASP.NET MVC并且路由.ashx处理程序不符合您的要求,您可能需要查看Nancy,“lightweight web framework”。
以下是介绍中的示例(请参阅上一段中的链接):
public class Module : NancyModule
{
public Module() : base("/foo")
{
Get["/"] = parameters => {
return "This is the site route";
};
Delete["/product/{id}"] = parameters => {
return string.Concat("You requested that the following product should be deleted: ", parameters.id);
};
}
}
此类将处理对/ foo和/ foo / product / 42的请求。您还可以使用此框架的视图来呈现更复杂的(HTML)响应。
答案 2 :(得分:2)
如果您可以从3.5更新到4.0,WebForms支持更好的路由。在Global.asax中,您只需要执行以下操作:
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapPageRoute("default", string.Empty, "~/default.aspx");
}
我不太了解“纯类”部分,但希望如果更新到4.0是一个选项,这可以帮助你。