是否可以重置ServicePointManager?

时间:2012-04-25 17:48:23

标签: c# .net sockets email network-programming

我正在尝试遵循与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。

2 个答案:

答案 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操作。