1 回答
TA贡献1942条经验 获得超3个赞
如果要在单个 ASP.NET Core 应用程序中实现此功能,可以执行以下操作:
在路径/Api 上说使 Api 控制器可用。您可以使用路由、区域或应用程序分支来实现这一点。
使用能够重写 URL 的反向代理(例如 Win 上的 IIS、Linux 上的 Nginx)。配置反向代理,以便将到达api.mysite.com/path的请求作为/Api/path转发到您的应用程序。
备注:如果你想在你的 Api 控制器中生成 URL,你应该从路径中删除/Api前缀以获得正确的 URL(当然你必须配置你的反向代理以附加必要的标头,如X-Forwarded-Host等)为此,您可以使用这个简单的中间件。
更新
正如评论中所讨论的,在这种情况下,应用程序分支似乎是最佳解决方案,因为它为 MVC 和 API 应用程序部分启用了单独的管道。
实际上,定义分支非常容易。您需要做的就是在Startup类的Configure方法中的主管道的开头放置一个Map调用:
public void Configure(IApplicationBuilder app)
{
app.Map("/Api", BuildApiBranch);
// middlewares for the mvc app, e.g.
app.UseStaticFiles();
// some other middlewares maybe...
app.UseMvc(...);
}
private static void BuildApiBranch(IApplicationBuilder app)
{
// middlewares for the web api...
app.UseMvc(...);
}
现在,当请求到达并且其路径以/Api开头时,请求会“偏转”并通过分支管道(在BuildApiBranch方法中定义)而不是通过主管道(在Configure方法中定义,在Map调用之后) .
要记住的一些事情:
当请求被分支“捕获”时,前缀/Api从HttpContext.Request.Path属性中删除(并附加到HttpContext.Request.PathBase)。所以你需要在UseMvc方法中定义 API 路由,就好像请求路径根本没有前缀一样。
使用此代码,您有两个单独的管道,但它们共享在Startup.ConfigureServices 中注册的组件。如果这是不希望的,可以为每个管道创建单独的 DI 容器。然而,这是一个有点高级的话题。
- 1 回答
- 0 关注
- 216 浏览
添加回答
举报