ASP.NET MVC和ASP .NET Web窗體共享相同的路由基礎設施中,這兩個框架最終需要拿出一個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);
您可能需要通過一些跳鐵圈使用實例化處理程序的BuildManager如果使用.ashx的文件*。如果沒有,你可以只新你的類的實例並返回它:
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;
}
看到這個問題的答案路由純IHttpHandlers的更深入的分析:Can ASP.NET Routing be used to create 「clean」 URLs for .ashx (IHttpHander) handlers?
**我'不完全確定BuildManager的例子,有人請糾正我,如果我得到那部分錯誤*
要上課嗎?就像在App_Code/YourClass.cs中一樣? – justinlabenne 2012-01-07 21:39:31
不,我想在MVC控制器路由中這樣做:例如產品的控制器是一個純粹的類,您可以通過http://domain.com/product – user310291 2012-01-07 22:17:33
訪問什麼是純類?控制器從System.Web.Mvc.Controller繼承,而Web Form從System.Web.UI.Page繼承。兩者都是類,什麼使得第一個純粹的和第二個不是? – 2012-01-08 00:08:42