Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以在.NET4中动态创建路由吗?_C#_.net_Asp.net_.net 4.0_Routing - Fatal编程技术网

C# 可以在.NET4中动态创建路由吗?

C# 可以在.NET4中动态创建路由吗?,c#,.net,asp.net,.net-4.0,routing,C#,.net,Asp.net,.net 4.0,Routing,在我们的应用程序中,我们使用新的.NET4路由系统将某些请求路由到站点的其他部分。我们只允许在深夜发布我们的网站代码,这意味着我们必须加班才能发布任何代码更改。我们经常需要创建自定义路由来支持旧内容的旧链接,并将它们路由到新内容。当我们的路线在compiled global.asax中定义时,我们经常会立即需要这些,当我们需要这些实时的但无法进行代码推送时,我们就会陷入僵局 是否有一种方法可以在某种配置文件中定义路由,并让站点以编程方式读取路由,而无需重新启动应用程序?因为更改配置文件需要重新启

在我们的应用程序中,我们使用新的.NET4路由系统将某些请求路由到站点的其他部分。我们只允许在深夜发布我们的网站代码,这意味着我们必须加班才能发布任何代码更改。我们经常需要创建自定义路由来支持旧内容的旧链接,并将它们路由到新内容。当我们的路线在compiled global.asax中定义时,我们经常会立即需要这些,当我们需要这些实时的但无法进行代码推送时,我们就会陷入僵局


是否有一种方法可以在某种配置文件中定义路由,并让站点以编程方式读取路由,而无需重新启动应用程序?

因为更改配置文件需要重新启动应用程序(即使不会,路由也只在启动时注册,而不是在每次请求时注册),我不明白为什么路由注册(用于开始?)不能在库“仅用于路由”(Routes.dll)中

我一直在使用MVCTurbine,它支持自动依赖注入/服务注册和路由注册。我使用这样的类进行路线注册:

public class RouteRegistrator : MvcTurbine.Routing.IRouteRegistrator
    {
        /// <summary>
        /// Registers routes within <see cref="T:System.Web.Routing.RouteCollection"/> for the application.
        /// </summary>
        /// <param name="routes">The <see cref="T:System.Web.Routing.RouteCollection"/> from the <see cref="P:System.Web.Routing.RouteTable.Routes"/>.</param>
        public void Register(System.Web.Routing.RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new string[] { "MyNamespace.Controllers" }); // Parameter defaults
        }
    }
公共类路由注册器:MvcTurbine.Routing.IRouteRegistrator
{
/// 
///在中为应用程序注册路由。
/// 
///从。
公共无效寄存器(System.Web.Routing.RouteCollection routes)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(
“默认值”,//路由名称
“{controller}/{action}/{id}”,//带参数的URL
新建{controller=“Home”,action=“Index”,id=UrlParameter.Optional},
新字符串[]{“MyNamespace.Controllers”};//参数默认值
}
}
此类不必是webui项目的一部分,但可以位于单独的dll中。MVCTurbine自动加载(并调用)bin文件夹库中的IRouteRegistrator和IServiceRegistrator的所有实现(无需引用)。而且,正如我所知,并没有任何东西阻止您通过将包含IRouteRegistrator实现中的新路由的dll添加到应用程序的bin文件夹来添加新路由。通过这种方式,您可以“在运行中”添加新路由,而不会危及应用程序的其余部分(如果发生意外情况,可以轻松删除新的dll)

如果您不能或不愿使用MVC Turbine,则可以使用此概念通过将routes集合从global.asax传递到动态加载的库(包含(仅)带有路由注册方法的类),将路由注册“提取”到外部dll


以此(MVCTurbine或非MVCTurbine)为起点,如果需要,您可以轻松地将xml或txt配置文件读入常见路由的foreach循环中,但该方法仅限于简单路由,因为很难(复杂,但并非不可能)以文本形式表示任何更复杂的路由配置。

与问题无关,但是,您是否考虑过具有持续集成的自动化部署?这些可以帮助你回到家庭的时间。@约旦,我们有很多事情我们考虑部署改进,但我不直接有任何控制。我们发布时需要在这里,以确保实时服务器上没有任何中断。我希望我们能加入TeamCity,让它自动化,但这不是我的决定。所有这些都不能解决需要在运行中抛出路由的问题,因为他们仍然需要等到自动发布。是的,我有点害怕“因为配置文件的更改需要重新启动应用程序”。不幸的是,这就是我们不能在白天推送的全部原因,我们不允许重新启动应用程序。它是一个内部站点,员工使用它来完成工作。重新启动它通常会让他们感到悲伤。不过,谢谢您的回答,将我们的路由编译成单独的dll可能会很有用。我甚至不确定这是否可行,但在每个请求上注册路由可能会让您损失大量性能。好的,如果您使用mvc,会话不应该包含任何数据,并且如果您启用了基于cookie的身份验证,小重启难道不是很无害吗?:)无论如何,希望你们能给“全体员工”发邮件,通知服务器将在x点重新启动,请保存你们的工作。。。我认为管理层需要决定什么是更大的紧急情况——正在进行的工作还是新的路线:萨格里德,这是一条在沙地上的强硬路线,几乎没有妥协的余地。除非有人有更好的答案,否则管理层必须意识到这一事实,他们可以决定什么对他们更重要。谢谢obrad。你可能想看看这个资源,ali62b发布了一个答案,建议使用一个“全覆盖”参数,如果动态路由可以由一个通用路由(某个区域)管理到“主”控制器,然后根据参数从那里重定向,你可以使用这个参数,但这实际上取决于你的场景。有趣的想法。我将进一步探讨这一点。