使用路径前缀在生产中运行asp.net核心应用

Efr*_*ain 3 .net .net-core asp.net-core dotnet-linux

我有一个asp.net核心 Web API,可以从命令行启动(在Linux主机上)

dotnet MyWebApi.dll
Run Code Online (Sandbox Code Playgroud)

这将启动一些监听的Web服务器localhost:5000(默认情况下)。假设我有一个ValuesController侦听path的对象/values/。因此,我可以从那里得到我的价值观http://localhost:5000/values/,一切都很好。

现在,我需要api为api中的所有本地路径添加一个前缀,以便值控制器将对进行响应localhost:5000/api/values

我找不到执行此操作的优雅方法。显然,我可以在控制器的路由配置中对其进行更改-但这是非常多余的,并且需要进行大量更改,因为我们有很多控制器,并且我们[Route(..)]在控制器本身上使用属性。

我在webapi项目applicationUrllaunchsettings.json文件中看到了该属性。显然,它包含用于Visual Studio调试/启动的配置。在其中添加前缀(通过项目属性>调试)可以正常工作,并且完全满足我的需要,但这仅适用于从VisualStudio(即dotnet run)启动它。在生产环境中,我只有dotnet publish可用的工件- launchsettings.json文件没有被复制到那儿,并且似乎没有办法将这样的文件提供给dotnet [assembly]启动命令(例如dotnet run)。


我为什么需要这样做的一些背景知识:让api控制器进行监听的模式/来自IIS,因为在站点的子文件夹中添加应用程序是很常见的,它处理路径前缀部分。现在,我使用docker部署我的应用程序,并且api有其自己的容器,该容器以上述命令开头-因此缺少前缀,因此我需要以某种方式将其重新添加。

Efr*_*ain 5

我在Startup.cs添加的内容中找到了解决问题的方法UseBasePath

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // .. 

        app.UsePathBase(new PathString("/api"));
        app.UseMvc();
    }
Run Code Online (Sandbox Code Playgroud)

这样可以从localhost:5000/api/values 获取值localhost:5000/values。我真的不需要或不喜欢这种模棱两可的方法,但是现在它解决了我的问题。