asp.net-mvc – 在运行时替换控制器操作
|
我们有一个已部署的ASP.NET MVC 3应用程序,并在其中一个控制器操作中发现了一个错误.出于政治原因,我们不允许替换任何现有的代码,如果没有一个需要数周头痛的大流程.即我们无法重建MVC应用程序.
我们被允许部署一个新的程序集,其中包含一个只有一个固定动作的新控制器. 有没有办法添加或编辑MVC应用程序的路由来映射新的控制器操作? 我正在考虑将我的MVC应用程序子类化在修复程序DLL中并更新global.asax以引用子类应用程序. public class HotfixApplication : RealApplication
{
public override void Init()
{
base.Init();
var badRoute = RouteTable.Routes.Where(...);
var badRoute.FixIt();
}
}
它将路由到修补程序DLL中的控制器操作. 这听起来有道理吗?安全? 解决方法
尝试基于ControllerFactory,HttpModule的这种方法:
脚步: 1#创建一个新的“类库”项目.添加对asp.net mvc Web应用程序项目的引用.还要添加对’System.Web’,’System.Web.Mvc’,’Microsoft.Web.Infrastructure.dll’程序集的引用. 2#创建一个从控制器(TargetController)继承的新Controller类,它有以下错误: public class FixedContorller : TargetController
{
[FixedActionSelector]
[ActionName("Index")]
public ActionResult FixedIndex()
{
ViewBag.Title = "I'm Fixed...";
return View();
}
}
[FixedActionSelectorAttribute]是ActionSelector属性,用于解析操作名称. public class FixedActionSelector : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(ControllerContext controllerContext,System.Reflection.MethodInfo methodInfo)
{
return true;
}
}
3#定义一个自定义ControllerFactory,它将创建固定控制器而不是目标控制器: public class MyControllerFactory : DefaultControllerFactory
{
private static string targetControllerName = "Target";
private static string targetActionName = "Index";
protected override Type GetControllerType(System.Web.Routing.RequestContext requestContext,string controllerName)
{
var action = requestContext.RouteData.Values["action"].ToString();
if (targetControllerName.Equals(controllerName,StringComparison.InvariantCultureIgnoreCase) &&
targetActionName.Equals(action,StringComparison.InvariantCultureIgnoreCase))
{
return typeof(FixedContorller);
}
return base.GetControllerType(requestContext,controllerName);
}
}
4#现在定义一个HttpModule,它将在应用程序init上设置上述controller-factory. httpModule将以编程方式注册自己,无需在web.config中注册. using System;
using System.Web;
using System.Web.Mvc;
[assembly: PreApplicationStartMethod(typeof(YourApp.Patch.FixerModule),"Register")]
namespace YourApp.Patch
{
public class FixerModule : IHttpModule
{
private static bool isStarted = false;
private static object locker = new object();
public void Dispose()
{
}
public void Init(HttpApplication context)
{
if (!isStarted)
{
lock (locker)
{
if (!isStarted)
{
ControllerBuilder.Current.SetControllerFactory(typeof(MyControllerFactory));
isStarted = true;
}
}
}
}
public static void Register()
{
Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(FixerModule));
}
}
}
编译项目并将.dll复制到Web应用程序的bin文件夹中. 希望这有助于…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 在ajax调用中ASP.NET MVC错误的url
- asp.net-mvc – ASP.NET MVC 4覆盖发出的html名称和id
- asp.net-mvc-3 – 实体框架4.1自动日期
- asp.net – 无法加载文件或程序集“Oracle.DataAccess”或其
- asp.net – MVC3 WebImage助手:resize将透明背景转换为黑色
- asp.net – Web用户控件通过XML填充项目
- asp.net-mvc – 覆盖EditorForModel模板
- asp.net – 当主内容没有填满页面时,如何在主页面上获取“页
- asp.net – Page_ClientValidate正在多次验证
- ASP.NET Base-64字符串中的字符无效
- asp.net – SelectedValue是无效的,因为它不存在
- asp.net-mvc – 如何在ASP.NET MVC中提供自己的I
- 为什么Asp.net web项目在url中有垃圾值?
- asp.net – 是否有可能过滤SignalR中的接收器?
- asp.net-mvc – 过滤Kendo UI MVC Grid时的自定义
- asp-classic – 使用SMTP身份验证的经典ASP发送电
- 实验五:ASP+MSSQL的web搭建
- Phonegap上的ASP.NET窗体身份验证问题(Android)
- asp.net错误表单不能嵌套在元素表单中?
- 如何在ASP.NET下拉列表的每个ListItem中保存第三
