Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Net.Mail.SMTPClient如何进行本地IP绑定_C#_Sockets_Email - Fatal编程技术网

C# System.Net.Mail.SMTPClient如何进行本地IP绑定

C# System.Net.Mail.SMTPClient如何进行本地IP绑定,c#,sockets,email,C#,Sockets,Email,我们有一个负载平衡(NLB)ASP.NET web应用程序,用于发送电子邮件 服务器是双主机,具有面向外部和面向内部(防火墙后)的IP。邮件服务器位于防火墙后面 我们遇到了一个问题,SMTPClient类抛出一个异常,说明它无法连接到SMTP服务器 网络人员告诉我们,他们看到有人试图从面向外部的IP地址(防火墙正在阻止)连接到SMTP服务器 根据我对支持网络的应用程序的了解(当然是零碎的),我认为本地IP绑定将根据目的地决定,即如果路由表说IP地址可以通过特定NIC访问,而不是生成出站请求的IP

我们有一个负载平衡(NLB)ASP.NET web应用程序,用于发送电子邮件

服务器是双主机,具有面向外部和面向内部(防火墙后)的IP。邮件服务器位于防火墙后面

我们遇到了一个问题,SMTPClient类抛出一个异常,说明它无法连接到SMTP服务器

网络人员告诉我们,他们看到有人试图从面向外部的IP地址(防火墙正在阻止)连接到SMTP服务器

根据我对支持网络的应用程序的了解(当然是零碎的),我认为本地IP绑定将根据目的地决定,即如果路由表说IP地址可以通过特定NIC访问,而不是生成出站请求的IP。我错了吗

看看SmtpClient.ServicePoint,我开始认为我们可能是,我们可以(应该)强制显式绑定到特定的IP

具体而言,我一直在关注
从那一页

备注:一些负载平衡技术 要求客户端使用特定的 本地IP地址和端口号, 而不是IP地址。任何(或 IPAddress.ipv6适用于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);
}
public委托IPEndPoint BindIPEndPoint(ServicePoint ServicePoint,IPEndPoint remoteEndPoint,int retryCount);
专用IPEndPoint BindIPEndPointCallback(ServicePoint ServicePoint、IPEndPoint remoteEndPoint、int retryCount){
if(retryCount<3&&ddSendFrom.SelectedValue.Length>0)
返回新的IPEndPoint(IPAddress.Parse(“192.168.1.100”),0);//绑定到服务器上的特定ip地址
其他的
返回新的IPEndPoint(IPAddress.Any,0);
}
受保护的无效btnTestMail\u单击(对象发送方,事件参数e){
MailMessage msg=新的MailMessage();
msg.Body=“电子邮件正在工作!”;
msg.From=新邮件地址(“me@me.com");
msg.IsBodyHtml=false;
msg.Subject=“邮件测试”;
msg.To.Add(新邮件地址(“you@you.com"));
SmtpClient=新的SmtpClient();
client.Host=“192.168.1.1”;
客户端端口=25;
client.enablesl=false;
client.ServicePoint.BindIPEndPointDelegate=new System.Net.BindIPEndPoint(BindIPEndPointCallback);
client.Send(msg);
}

这似乎是正确的,尽管我仍然有点惊讶它没有按我预期的方式工作。如果我尝试使用特定的地址,程序将挂起到client.Send上。这会是什么?