我们有一个发送电子邮件的负载平衡 (NLB) ASP.NET Web 应用程序。
服务器是双宿主的,具有面向外部和面向内部(在防火墙后面)的 IP。邮件服务器位于防火墙后面。
我们发现了一个问题,即 SMTPClient 类抛出一个异常,表明它无法连接到 SMTP 服务器。
网络人员告诉我们,他们看到尝试从面向外部的 IP 地址(防火墙阻止)连接到 SMTP 服务器
根据我对启用网络的应用程序的(无可否认的)知识,我认为本地 IP 绑定将根据目的地决定,即如果路由表说 IP 地址可以通过特定的 NIC 访问,而不是出站请求的 IP是从产生的。我错了吗?
看着 SmtpClient.ServicePoint 我开始认为我们可能是并且我们可以(应该)强制显式绑定到特定 IP?
具体来说,我一直在
从该页面查看
ServicePoint.BindIPEndPointDelegate 属性...
备注:某些负载平衡技术要求客户端使用特定的本地 IP 地址和端口号,而不是 IPAddress.Any(或 IPAddress.IPv6Any 用于 Internet 协议版本 6)和临时端口。您的 BindIPEndPointDelegate 可以满足此要求。
我需要这样做对我来说似乎有点奇怪,但也许这在这种类型的环境中很常见?
你需要做这样的事情......
public delegate IPEndPoint BindIPEndPoint(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount);
private IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount) {
if (retryCount < 3 && ddSendFrom.SelectedValue.Length > 0)
return new IPEndPoint(IPAddress.Parse("192.168.1.100"), 0); //bind to a specific ip address on your server
else
return new IPEndPoint(IPAddress.Any, 0);
}
protected void btnTestMail_Click(object sender, EventArgs e) {
MailMessage msg = new MailMessage();
msg.Body = "Email is working!";
msg.From = new MailAddress("me@me.com");
msg.IsBodyHtml = false;
msg.Subject = "Mail Test";
msg.To.Add(new MailAddress("you@you.com"));
SmtpClient client = new SmtpClient();
client.Host = "192.168.1.1";
client.Port = 25;
client.EnableSsl = false;
client.ServicePoint.BindIPEndPointDelegate = new System.Net.BindIPEndPoint(BindIPEndPointCallback);
client.Send(msg);
}
Run Code Online (Sandbox Code Playgroud)