我正在尝试遵循与How does System.Net.Mail.SMTPClient do its local IP binding处给出的代码类似的代码我在具有多个IP地址的计算机上使用Windows 7和.Net 4.0。我有BindIPEndPointDelegate定义的
private static IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)
{
string IPAddr = //some logic to return a different IP each time
return new IPEndPoint(IPAddr, 0);
}
然后我使用
发送电子邮件SmtpClient client = new SmtpClient();
client.Host = SMTP_SERVER; //IP Address as string
client.Port = 25;
client.EnableSsl = false;
client.ServicePoint.BindIPEndPointDelegate
= new System.Net.BindIPEndPoint(BindIPEndPointCallback);
client.ServicePoint.ConnectionLeaseTimeout = 0;
client.Send(msg); //msg is of type MailMessage properly initialized/set
client = null;
第一次调用此代码时,将调用委托,无论设置何种IP地址,都会使用它。随后调用此代码时,委托永远不会被称为 ,即。随后使用第一个IP地址。 是否可以更改这种情况,每次调用代码时,都会调用委托回调?
我在想ServicePointManager(这是一个静态类)会缓存第一次调用委托的结果。是否可以重置此课程?我不关心表现。
谢谢你, O. O。
答案 0 :(得分:1)
我遇到了类似的问题,想要重置 ServicePointManager 并更改不同测试结果的证书。对我有用的方法是将MaxServicePointIdleTime设置为一个较低的值,这将有效地重置它。
ServicePointManager.MaxServicePointIdleTime = 1;
答案 1 :(得分:0)
我在上面发布的问题中遇到的问题是,所有电子邮件都将使用第一条消息的IP发送出去。我认为(可能是 ServicePointManager )正在缓存连接。虽然我没有找到重置 ServicePointManager 的解决方案,但我意识到,即使您很快致电client = null;
,我上面设置GC.Collect();
的尝试并没有真正关闭连接。我发现的唯一工作是:
SmtpClient client = new SmtpClient();
//Remaining code here....
client.Send(msg);
client.Dispose(); //Secret Sauce
发送每条消息后调用client.Dispose();
始终会重置连接,因此下一条消息可以选择需要输出的IP地址。
0。 O操作。