public static void RegisterRoutes(RouteCollection routes)
{
//MVC
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
//WebForm
routes.MapPageRoute(
routeName: "WebForm",
routeUrl: "Admin/{user}",
physicalFile: "~/Admin/User.aspx"
);
}
public class UrlRoutingModule : IHttpModule {
public RouteCollection RouteCollection {
get {
if (_routeCollection == null) {
//全局的RouteCollection集合
_routeCollection = RouteTable.Routes;
}
return _routeCollection;
}
set {
_routeCollection = value;
}
}
protected virtual void Init(HttpApplication application) {
//注册PostResolveRequestCache事件
application.PostResolveRequestCache += OnApplicationPostResolveRequestCache;
}
private void OnApplicationPostResolveRequestCache(object sender, EventArgs e) {
//创建上下文
HttpApplication app = (HttpApplication)sender;
HttpContextBase context = new HttpContextWrapper(app.Context);
PostResolveRequestCache(context);
}
public virtual void PostResolveRequestCache(HttpContextBase context) {
//1.获取RouteData
RouteData routeData = RouteCollection.GetRouteData(context);
if (routeData == null) {
return;
}
//2.获取IRouteHandler
IRouteHandler routeHandler = routeData.RouteHandler;
if (routeHandler == null) {
}
//RequestContext保证了HttpContext和RouteData,在后续使用
RequestContext requestContext = new RequestContext(context, routeData);
context.Request.RequestContext = requestContext;
//3.获取IHttpHandler
IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
//重新映射到处理程序
context.RemapHandler(httpHandler);
}
}
public RouteData GetRouteData(HttpContextBase httpContext) {
using (GetReadLock()) {
foreach (RouteBase route in this) {
RouteData routeData = route.GetRouteData(httpContext);
if (routeData != null) {
return routeData;
}
}
}
return null;
}
public override RouteData GetRouteData(HttpContextBase httpContext) {
string requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;
//结合默认值,匹配url
RouteValueDictionary values = _parsedRoute.Match(requestPath, Defaults);
if (values == null) {
return null;
}
//包装成RouteData,这里为什么不放在if后面呢?
RouteData routeData = new RouteData(this, RouteHandler);
//匹配约束
if (!ProcessConstraints(httpContext, values, RouteDirection.IncomingRequest)) {
return null;
}
//RouteData的Values和DataTokens都来自于Route
foreach (var value in values) {
routeData.Values.Add(value.Key, value.Value);
}
if (DataTokens != null) {
foreach (var prop in DataTokens) {
routeData.DataTokens[prop.Key] = prop.Value;
}
}
return routeData;
}
public interface IRouteHandler {
IHttpHandler GetHttpHandler(RequestContext requestContext);
}
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
{
//创建一个Route对象,它的IRouteHandler为MvcRouteHandler
Route route = new Route(url, new MvcRouteHandler())
{
Defaults = CreateRouteValueDictionary(defaults),
Constraints = CreateRouteValueDictionary(constraints),
DataTokens = new RouteValueDictionary()
};
if ((namespaces != null) && (namespaces.Length > 0))
{
route.DataTokens["Namespaces"] = namespaces;
}
//将Route注册到RouteCollection中
routes.Add(name, route);
return route;
}
protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
{
//设置session状态
requestContext.HttpContext.SetSessionStateBehavior(GetSessionStateBehavior(requestContext));
//返回一个实现了IHttpHandler的MvcHandler
return new MvcHandler(requestContext);
}
public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState
{
protected internal virtual IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state)
{
IController controller;
IControllerFactory factory;
//这个方法里会激活Controller对象
ProcessRequestInit(httpContext, out controller, out factory);
IAsyncController asyncController = controller as IAsyncController;
if (asyncController != null)
{
// asynchronous controller
BeginInvokeDelegate beginDelegate = delegate(AsyncCallback asyncCallback, object asyncState)
{
try
{
//调用Controller的BeginExecute方法
return asyncController.BeginExecute(RequestContext, asyncCallback, asyncState);
}
catch
{
factory.ReleaseController(asyncController);
throw;
}
};
EndInvokeDelegate endDelegate = delegate(IAsyncResult asyncResult)
{
try
{
asyncController.EndExecute(asyncResult);
}
finally
{
factory.ReleaseController(asyncController);
}
};
SynchronizationContext syncContext = SynchronizationContextUtil.GetSynchronizationContext();
AsyncCallback newCallback = AsyncUtil.WrapCallbackForSynchronizedExecution(callback, syncContext);
return AsyncResultWrapper.Begin(newCallback, state, beginDelegate, endDelegate, _processRequestTag);
}
else
{
// synchronous controller
Action action = delegate
{
try
{
controller.Execute(RequestContext);
}
finally
{
factory.ReleaseController(controller);
}
};
return AsyncResultWrapper.BeginSynchronous(callback, state, action, _processRequestTag);
}
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有