在使用Asp.net GenericJsonWebHook时,如果将服务部署在负载均衡器(load balancer)后面,会导致WebHook收到的回调请求IP不正确的问题。为了解决这个问题,需要在Asp.net GenericJsonWebHook中添加一些代码,以适应负载均衡器的部署。
以下是一个示例代码,可以解决此问题:
public class LoadBalancedWebHookReceiver : WebHookReceiver
{
public override async Task ReceiveAsync(string generator, WebHookHandlerContext context)
{
var ipAddress = context.Request.Headers.TryGetValue("X-Forwarded-For", out var forwardedHeaders) ? forwardedHeaders[0] : context.Request.Host.Host;
context.Properties.TryAdd("MS_HttpContext", new HttpContextWrapper(System.Web.HttpContext.Current));
await base.ReceiveAsync(generator, new WebHookHandlerContext()
{
Id = context.Id,
Receiver = context.Receiver,
Request = context.Request,
Response = context.Response,
Configuration = context.Configuration,
Properties =
{
// Add custom properties for IP address
{ "LoadBalancerIpAddress", ipAddress }
}
});
}
}
这个代码中,我们创建了一个新的类LoadBalancedWebHookReceiver,继承自Asp.net GenericJsonWebHook中的WebHookReceiver类。在ReceiveAsync方法中,我们检查了HTTP请求的X-Forwarded-For头部,获取到真实的客户端IP地址,然后将它保存到Properties集合中,使用LoadBalancerIpAddress作为名称。
在这个解决方案中,我们建议部署一个高可用(HA)负载均衡器,以确保若干个Asp.net GenericJsonWebHook实例之间的负载均衡和故障恢复。