0

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

URL 结构必须类似于:

http://server/app/[enterprise]/[communinty]/ {controller}/{action}/...

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

原因如下:

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

任何有关如何实施此方案或替代解决方案的建议将不胜感激。

我们在 IIS 7 上,如果这有什么不同的话。

4

2 回答 2

1

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

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

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

于 2010-07-26T18:55:37.263 回答
0

这是 IIS 重写模块的可能解决方案。这可能不是最好的方法,但它可能会奏效。MVC 路由中是否有更简单/更好的选择?没有把握。我自己才刚刚开始这样做。

以“ http://server.com/app/enterprise/community/controller/action/ ”为例。

发生什么了:

  1. 从 URL 中去除字符串。新网址: http ://server.com/controller/action/
  2. 将用户重定向到新的 URL。用户的浏览器现在显示: http ://server.com/controller/action/
  3. 获取新 URL 并尝试重建它以获取正确的内容。用户浏览器显示: http ://server.com/controller/action/ ;IIS 返回: http ://server.com/app/enterprise/community/controller/action/

一旦安装了 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>

注意:只是快速完成,尚未测试。

于 2010-07-23T20:31:24.507 回答