gpt4 book ai didi

asp.net-mvc - 在运行时替换 Controller Action

转载 作者:行者123 更新时间:2023-12-04 15:35:50 24 4
gpt4 key购买 nike

我们部署了一个 ASP.NET MVC 3 应用程序,并在其中一个 Controller 操作中发现了一个错误。出于政治原因,我们不允许在没有需要数周时间的大流程的情况下替换任何现有代码。 IE。我们无法重建 MVC 应用程序。

我们被允许部署一个新的程序集,其中包含一个只有一个固定 Action 的新 Controller 。

有没有办法添加或编辑 MVC 应用程序的路由以映射新的 Controller 操作?

我正在考虑在修补程序 DLL 中子类化我的 MVC 应用程序并更新 global.asax 以引用子类化的应用程序。

public class HotfixApplication : RealApplication
{
public override void Init()
{
base.Init();
var badRoute = RouteTable.Routes.Where(...);
var badRoute.FixIt();
}
}

它会路由到修补程序 DLL 中的 Controller 操作。

这听起来合理吗?安全的?

最佳答案

尝试基于ControllerFactory,HttpModule的这种方法:

步骤:

1# 创建一个新的“类库”项目。添加对您的 asp.net mvc Web 应用程序项目的引用。还添加对“System.Web”、“System.Web.Mvc”、“Microsoft.Web.Infrastructure.dll”程序集的引用。

2#新建一个继承自有bug的 Controller (TargetController)的Controller类:

public class FixedContorller : TargetController
{

[FixedActionSelector]
[ActionName("Index")]
public ActionResult FixedIndex()
{
ViewBag.Title = "I'm Fixed...";
return View();
}
}

[FixedActionSelectorAttribute] 是 ActionSelector 属性,用于解析 Action 名称。
    public class FixedActionSelector : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
return true;
}
}

3#定义一个自定义ControllerFactory,它将创建固定 Controller 而不是目标 Controller :
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,它将在应用程序初始化时设置上述 Controller 工厂。 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 - 在运行时替换 Controller Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10453622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com