Ocelot允许在请求下游服务之前和之后转换头部.目前Ocelot只支持查找和替换.这个功能在Github #190提出.我确定这个功能可以在各个方面发挥作用。
添加到请求
这个功能在GitHub #313被提出。
如果你想在你的上游请求中添加一个头,请在ocelot.json
文件的Route
中添加如下配置:
"UpstreamHeaderTransform": {
"Uncle": "Bob"
}
上面例子中,一个键为Uncle
,值为Bob
的头将被添加到上游服务中。
也支持占位符(看下面)。
添加到响应
这个功能在GitHub #280被提出。
如果你想在你的下游响应中添加一个头,请在ocelot.json
文件的Route
中添加如下配置:
"DownstreamHeaderTransform": {
"Uncle": "Bob"
},
上面例子中,当请求一个特定Route
的时候,Ocelot将返回一个键为Uncle
,值为Bob
的头。
如果你想返回Butterfly
跟踪id
,需要像下面这样…
"DownstreamHeaderTransform": {
"AnyKey": "{TraceId}"
},
查找并替换
为了变换头,首先我们指定头的键,然后指定我们想要的变换内容,例如
"Test": "http://www.bbc.co.uk/, http://ocelot.com/"
上面键是"Test",值是“http://www.bbc.co.uk/,http://ocelot.com/”,这个值的意思是使用http://ocelot.com/
替换http://www.bbc.co.uk/
,语法是{find},{replace}
。希望还算简单明了,更多解释在下面例子中。
下游请求之前
在ocelot.json的Route
中添加如下配置 ,以便用http://ocelot.com/
替换http://www.bbc.co.uk/
.Test
头将被替换并发送到下游服务.
"UpstreamHeaderTransform": {
"Test": "http://www.bbc.co.uk/, http://ocelot.com/"
},
下游请求之后
在ocelot.json
的Route
中添加如下配置 ,以便用http://ocelot.com/
替换http://www.bbc.co.uk/
. 当Ocelot收到下游服务响应之后将进行替换.
"DownstreamHeaderTransform": {
"Test": "http://www.bbc.co.uk/, http://ocelot.com/"
},
占位符
Ocelot允许在头不转换中使用占位符.
{RemoteIpAddress}
-这将使用_httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString()
查找客户端IP地址,以便您获取一些IP。 {BaseUrl}
-这将使用Ocelot的基本基本url
. 例如http://localhost:5000/
作为其值。
{DownstreamBaseUrl}
-这将使用下游服务的基本url,例如 httphttp://localhost:5000/
作为其值。 目前,这仅适用于DownstreamHeaderTransform
。
{TraceId}
-这将使用Butterfly
的跟踪ID。 目前,这仅适用于DownstreamHeaderTransform
。
{UpstreamHost}
-这将查找传入的Host
标头。
处理 302 重定向
Ocelot默认会自动遵循重定向,但是如果您想将location
头返回给客户端,您可能需要将location
更改为Ocelot
而不是下游服务。 Ocelot
可以使用以下配置实现。
"DownstreamHeaderTransform": {
"Location": "http://www.bbc.co.uk/, http://ocelot.com/"
},
"HttpHandlerOptions": {
"AllowAutoRedirect": false,
},
你也可以使用BaseUrl
占位符.
"DownstreamHeaderTransform": {
"Location": "http://localhost:6773, {BaseUrl}"
},
"HttpHandlerOptions": {
"AllowAutoRedirect": false,
},
最后,如果你使用负载均衡的话,你将得到多个下游基地址,所以像上面那样是不能正常工作的.在这种情况下你可以如下配置.
"DownstreamHeaderTransform": {
"Location": "{DownstreamBaseUrl}, {BaseUrl}"
},
"HttpHandlerOptions": {
"AllowAutoRedirect": false,
},
X-Forwarded-For
使用{RemoteIpAddress}
占位符的示例…
"UpstreamHeaderTransform": {
"X-Forwarded-For": "{RemoteIpAddress}"
}
未来
理想情况下,这个特性能够支持实际上头部可以有多个值的情况。目前只是假设一个。 如果它可以查找和替换多个值应该是非常棒的。
"DownstreamHeaderTransform": {
"Location": "[{one,one},{two,two}"
},
"HttpHandlerOptions": {
"AllowAutoRedirect": false,
},
如果有人想在这一展身手,请自己搞定吧!