专栏首页张志敏的技术专栏在虚拟目录中部署 ASP.NET Core 应用

在虚拟目录中部署 ASP.NET Core 应用

在虚拟目录中部署 ASP.NET Core 应用

ASP.NET Core 已经发布了 2.0 RC1 (Go Live) 版本, API 已经不在变化, 但是很多人期待的已久的在虚拟目录中部署的功能还是没有出现, 看来只能自己想办法解决这个问题了。

由于 ASP.NET Core 有自己的服务器进程 (kestrel) , 在部署时通常是采用反向代理转发的形式, 对于应用服务器的集成上, 不如传统的 ASP.NET 应用那么友好, 比如在应用服务器的虚拟目录中部署, 一直没有很好的方案。

ASP.NET Core 有一个 UsePathBase 扩展方法, 使用一个中间件向当前 http 请求中添加或者移除根路径 (Pathbase) , 利用这个方法, 添加虚拟路径也就不难实现。

首先来定义并导出一个名称为 ASPNETCORE_PATHBASE 的环境变量,

export ASPNETCORE_PATHBASE=/MvcTestApp

再在 Startup.cs 文件中的 Configure 方法的最前面, 添加下面的代码, 读取这个环境变量, 将环境变量的值作为 PathBase 中间件, 代码如下所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
    // 读取环境变量 ASPNETCORE_PATHBASE
    var pathBase = Environment.GetEnvironmentVariable("ASPNETCORE_PATHBASE");
    // 如果 ASPNETCORE_PATHBASE 的值不为空, 则使用 Pathbase 中间件
    if (!string.IsNullOrEmpty(pathBase)) {
        app.UsePathBase(new PathString(pathBase));
        Console.WriteLine("Hosting pathbase: " + pathBase);
    }
}

注意, 一定要在 Configure 方法的最前面调用这个方法, 让 Pathbase 中间件成为第一个处理请求的中间件, 才能正确的模拟虚拟路径。

现在输入命令 dotnet run , 开始运行, 输出如下

Hosting pathbase: /MvcTestApp
Hosting environment: Development
Content root path: /Projects/MvcTestApp
Now listening on: https://localhost:5001
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

现在, 可以通过 http://localhost:5000/MvcTestApp/ 来访问这个应用了。

如果使用 Visual Studio 或者 VS Code 进行调试, 则需要修改 Properties 目录下的 launchSettings.json 文件, 为不同的 profile 均添加一个 ASPNETCORE_PATHBASE 环境变量, 如下所示:

{
    "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_PATHBASE": "/MvcTestApp"
    }
}

部署到生产环境下, 如果需要修改虚拟目录的值, 则只要调整环境变量 ASPNETCORE_PATHBASE 的值就行了, 不需要修改代码。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在 Android 的 /data 目录下添加虚拟内存

    Android 系统上添加虚拟内存已经不是什么新鲜事了, 很多手机都支持, 通常都是将虚拟内存添加到 SD 卡上, 不过由于 SD 卡的的读写速度有速度限制, ...

    beginor
  • 红黑树的创建

    实际上,为了避免二叉树形状向最坏情况靠拢, 通常会创建能够自平衡的 2-3 树。 而 红黑树 是 2-3 树比较简单的一种实现形式:

    beginor
  • 设计模式之原型模式

    Specify the kinds of objects to create using a prototypical instance, and create...

    beginor
  • python 实现 自动 svn che

    py3study
  • C++の表达式(2)

    今天,我们继续接着昨天的说,昨天说到了C++中表达式的左值与右值,由于时间关系就没有详细说完整。今天我们继续补充一下。

    leoay
  • Android 在任意位置绘制文本

    通常情况下,在屏幕的特定位置上显示文字是个很简单的事情。使用TextView,结合各种XxxLayout,基本上想在哪显示文字都可以。但当显示的文字需要频繁更新...

    Tiga
  • 全球服务器市场结构持续调整 智慧计算渐成主流

    众所周知,计算力是科技公司发挥价值的基础,更从一定层面上彰显着国家的软实力。在智能化、数字化浪潮充分涌流的当下,智慧计算在社会经济发展中的作用愈发凸显,有识之士...

    用户7261497
  • Python JSON 模块

    桑鱼
  • java Hello world 源码执行流程详解

    hello world 作为我们学习的第一个个程序,看起来很简单,但是要理解其执行的具体流程还是需要很深的功底,包括对组成原理,操作系统的理解,今天将java ...

    黑白格
  • HTTP请求报文和响应报文

    一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。

    郭耀华

扫码关注云+社区

领取腾讯云代金券