Asp.net mvc 2 高级ASP.NET MVC路由方案

Asp.net mvc 2 高级ASP.NET MVC路由方案,asp.net-mvc-2,asp.net-mvc-routing,web-deployment,asp.net-routing,Asp.net Mvc 2,Asp.net Mvc Routing,Web Deployment,Asp.net Routing,我有一个ASP.NET MVC应用程序,具有以下部署要求: URL结构必须类似于: {controller}/{action}/ 我想我能做的是在MVC路由处理程序得到URL之前拦截它,删除[enterprise]/[community]部分,然后允许MVC继续处理,就像原始URL没有包含这两个段一样 原因如下: 应用程序向多个客户(企业)公开多个门户,企业中的每个社区都有自己的用户群。这种方案也可以通过在每个[community]目录中实际部署一个应用程序实例(二进制文件、内容、web.con

我有一个ASP.NET MVC应用程序,具有以下部署要求:

URL结构必须类似于:

{controller}/{action}/

我想我能做的是在MVC路由处理程序得到URL之前拦截它,删除[enterprise]/[community]部分,然后允许MVC继续处理,就像原始URL没有包含这两个段一样

原因如下:

应用程序向多个客户(企业)公开多个门户,企业中的每个社区都有自己的用户群。这种方案也可以通过在每个[community]目录中实际部署一个应用程序实例(二进制文件、内容、web.config)来实现,但出于后勤和性能方面的原因,我认为我们不想走这条路。所以我试图通过路由技巧来虚拟化它

如果您对如何实施该计划或其他解决方案有任何建议,我们将不胜感激


我们使用的是IIS 7,如果这有什么不同的话。

这里有一个使用IIS重写模块的可能解决方案。这可能不是最好的方法,但可能有效。MVC路由中是否有更简单/更好的选择?不确定。我自己才刚开始这么做

以“”为例

发生了什么:

  • 从URL中删除字符串。新的 网址:
  • 将用户重定向到新URL。用户的 浏览器现在显示:
  • 获取新的URL并尝试 重新构建它以获取正确的 内容。用户浏览器显示: ; IIS返回:
  • 一旦安装了IIS重写模块,所有这些都将在web.config中:

    <rewrite>
        <rules>
            <clear />
    
            <rule name="Redirect to remove Offending String" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
                <match url="server.com/app/enterprise/community*" />
                <action type="Redirect" url="/{R:1}" />
                <conditions logicalGrouping="MatchAll">
                    <add input="{SERVER_NAME}" pattern="*server.com*" />
                </conditions>
            </rule>
    
            <rule name="Rewrite to get Original Content" enabled="true" patternSyntax="Wildcard" stopProcessing="false">
                <match url="*" />
                <conditions logicalGrouping="MatchAll">
                    <add input="{SERVER_NAME}" pattern="*server.com*" />
                </conditions>
                <action type="Rewrite" url="app/enterprise/community{R:1}" />
            </rule>
    
        </rules>
    </rewrite>
    
    
    

    注意:只是做得很快,还没有测试。

    您可以在默认路由之前使用以下路由

    routes.MapRoute(
        null,
        "{enterprise}/{community}/{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    

    然后,您可以忽略动作方法中的{enterprise}和{community}参数。

    因此人们可以访问
    http://server/app/MyCompany/FightingDogs/Home/Index
    然后您想要提取MyCompany/FightingDogs,以便URL现在可以读取
    http://server/app/Home/Index
    ?(我想您将MyCompany/Fightingdocs的引用存储在会话或cookie中?)不完全是这样。我希望浏览器可见URL保持不变,但我不希望MVC控制器/模型/等必须了解“MyCompany/FightingDogs”部分。不使用路由,而是在登录时将当前用户的企业和社区存储在会话中是否更有意义?我可以想象,如果URL对每个用户组都是唯一的,那么在文档中包含URL是很困难的。@Ryan-我们在应用程序中没有(服务器端)会话状态,我不想为此添加它。文件不是问题。我一直在考虑将这些信息作为声明添加到安全令牌cookike中。他使用的是mvc,它内置了路由(如果你不知道的话),我意识到mvc内置了路由,但从我认为jlew想要的内容来看,我读到了,认为mvc路由可能无法做到这一点。然而,在阅读了jlew的新评论后,我的方法无法满足他的要求,因为它直接处理MVC路由。你知道,我曾认为不可能“忽略”这些元素(视图模型需要包含它们),但看起来你是对的。谢谢