我们有一个负载均衡(NLB)ASP.NET Web应用程序,可以发送电子邮件。
服务器是双归属的,面向外部,内部(防火墙后面)面向IP。邮件服务器位于防火墙后面。
我们一直在遇到一个问题,即SMTPClient类会抛出一个异常,指出它无法连接到SMTP服务器。
网络人员告诉我们他们正在尝试从面向外部的IP地址(防火墙阻止的IP地址)连接到SMTP服务器
从我对网络启用的应用程序的认识(不可否认)我认为本地IP绑定将根据目的地决定,即如果路由表说IP地址可以通过特定的NIC访问而不是IP出站请求是从。生成的。我错了吗?
查看SmtpClient.ServicePoint我开始认为我们可能会(并且应该)强制显式绑定到特定的IP?
特别是我一直在看着 ServicePoint.BindIPEndPointDelegate Property 从该页面......
备注:一些负载均衡技术 要求客户使用特定的 本地IP地址和端口号, 而不是IPAddress.Any(或 IPAddress.IPv6Any for Internet 协议版本6)和短暂的 港口。你的BindIPEndPointDelegate可以 满足这个要求。
对我来说这似乎有点奇怪,我需要这样做,但也许在这种环境中很常见?
答案 0 :(得分:4)
你需要做这样的事情......
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);
}