You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET Core 8.0 MVC站点实现URL重写与版本管理?

ASP.NET Core 8 MVC多版本部署IIS配置方案

一、实现需求的具体方案

方案1:IIS URL重写模块(推荐,无需修改代码)

直接在站点的web.config中添加重写规则,即可实现URL转发与重定向:

<rewrite>
  <rules>
    <!-- 基础URL转发到最新版本,浏览器URL保持不变 -->
    <rule name="Forward to Latest Version" stopProcessing="true">
      <match url="^$" />
      <action type="Rewrite" url="/mysite/3.0/" />
    </rule>
    <!-- 基础URL下的子资源同步转发到最新版本 -->
    <rule name="Forward Subpaths to Latest" stopProcessing="true">
      <match url="^(.*)$" />
      <conditions>
        <add input="{REQUEST_URI}" pattern="^/mysite/(\d+\.\d+)/" negate="true" />
      </conditions>
      <action type="Rewrite" url="/mysite/3.0/{R:1}" />
    </rule>
    <!-- 访问带版本号的URL时,重定向到基础URL -->
    <rule name="Redirect Versioned URLs" stopProcessing="true">
      <match url="^(\d+\.\d+)/(.*)$" />
      <action type="Redirect" url="/mysite/{R:2}" redirectType="Permanent" />
    </rule>
  </rules>
</rewrite>

如果mysite是站点根目录,调整match和url中的路径即可。

方案2:ASP.NET Core自定义中间件(代码控制版本)

若不想依赖IIS模块,可在Program.cs中添加自定义中间件逻辑:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();

// 处理版本URL的中间件
app.Use(async (context, next) =>
{
    var requestPath = context.Request.Path.Value;
    var basePath = "/mysite";
    var latestVersion = "/3.0";

    // 访问带版本号的URL,直接重定向到基础URL
    var versionRegex = new System.Text.RegularExpressions.Regex($@"^{basePath}/(\d+\.\d+)(/.*)?$");
    if (versionRegex.IsMatch(requestPath))
    {
        var redirectPath = versionRegex.Replace(requestPath, $"{basePath}$2");
        context.Response.Redirect(redirectPath, permanent: true);
        return;
    }

    // 访问基础URL或其子路径,内部转发到最新版本
    if (requestPath.StartsWith(basePath) && !requestPath.StartsWith($"{basePath}{latestVersion}"))
    {
        context.Request.Path = requestPath.Replace(basePath, $"{basePath}{latestVersion}");
    }

    await next();
});

// 常规MVC路由配置
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

部署时需确保IIS应用程序池设置为.NET Core模式。

二、版本管理的更优方案

  • IIS应用程序池隔离:将每个版本部署为独立的IIS应用程序(而非虚拟目录),每个应用配置单独的应用程序池,避免版本间依赖冲突。基础URL对应一个空站点,通过重写规则指向最新版本,回滚时仅需修改重写规则中的版本路径。
  • CI/CD自动化部署:使用Azure DevOps、Jenkins等工具实现一键部署与回滚。每次发版自动创建新的应用目录并更新重写规则;可添加版本保留策略,自动清理过旧版本以节省服务器空间。
  • ARR反向代理管理:安装IIS的Application Request Routing(ARR)模块,将基础URL作为反向代理端点,后端指向最新版本站点。回滚时直接修改代理的后端地址,无需调整前端站点配置。
  • 健康检查与版本标识:为每个版本配置/health健康检查端点,CI/CD工具可在发布后自动验证版本可用性;在页面中添加隐藏的版本标识(如meta标签),方便排查问题时确认当前运行版本。

内容的提问来源于stack exchange,提问作者nattoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:15:26