我使用Ocelot作为api网关,遇到了配置问题。我试图替换来自api的"Location"头值的一部分(当api返回CreatedAtRoute(...)
结果时(。请参阅ocelot.json:的一部分
// ...
{
"UpstreamPathTemplate": "/hotels",
"UpstreamHttpMethod": [ "Post", "Put" ],
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "<api_host>",
"Port": 80
}
],
"DownstreamPathTemplate": "/api/hotels",
"DownstreamHeaderTransform": {
"Location": "{DownstreamBaseUrl}/api, {BaseUrl}" // the issue here
}
},
// ...
当发布新对象时,我想要在标题中显示什么(42只是随机数(:
Location: http://<gateway_host>/hotels/42
我实际得到的:
Location: http://<api_host>/api/hotels/42
也许没关系,但这两个应用程序都在docker中运行。
首先,我想强调的是,使用常规流程运行也会发生这种情况,而不仅仅是在docker环境中。
我使用的请求是POST:https://localhost:7051/api/project-manager/examples?exampleName=example1
(/api/project-manager
是Ocelot添加的前缀(。返回给Ocelot客户端的(坏(位置是https://localhost:2261/examples/example1
,与我在没有GW:的情况下直接尝试到web api时得到的位置相同
content-length: 2868
content-type: application/json; charset=utf-8
date: Mon,01 Aug 2022 11:27:23 GMT
location: https://localhost:2261/examples/example1
server: Kestrel
虽然我希望得到位置:https://localhost:7051/api/project-manager/examples/example1
缺少在-端口和路径转换中:/api/project-manager
前缀ocelot被配置为添加。
关于解决方案,我看到了另一个提供解决方案的讨论。因此,本次讨论可能是以下内容的重复:如何在CreatedAtRoute位置标头上添加网关基本路径-URL重写
在我的案例中,它通过将以下DownstreamHeaderTransform添加到配置中而有所帮助:
"UpstreamPathTemplate": "/api/project-manager/{everything}",
"DownstreamHeaderTransform": {
"Location": "{DownstreamBaseUrl}, {BaseUrl}/api/project-manager"
},
它产生了一个正确的(转换的(位置:
access-control-allow-origin: *
content-length: 2864
content-type: application/json; charset=utf-8
date: Tue,02 Aug 2022 07:52:25 GMT
location: https://localhost:7051/api/project-manager/examples/example1
server: Kestrel