纯ASP.NET路由到类不是aspx页面

时间:2012-01-07 21:02:36

标签: asp.net asp.net-mvc asp.net-mvc-3

我需要在现有的asp.net应用程序中进行路由 - 不是asp.net mvc(是的,我知道我应该转换但是现在说它不可能所以不要告诉我:)) - 我怎么能路由到普通类而不是aspx页面,因为我看到的所有示例代码总是与aspx页面一样:

http://msdn.microsoft.com/en-us/magazine/dd347546.aspx

准确地说,我想在MVC控制器路由中做一些事情:例如产品的控制器是您通过http://domain.com/product

访问的纯类

3 个答案:

答案 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.MvcHandlerwhich 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是一个选项,这可以帮助你。