2

我正在尝试遵循与System.Net.Mail.SMTPClient How 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(这是一个静态类)缓存第一次调用委托的结果。可以重置这个类吗?我不在乎性能。

谢谢你,OO

4

2 回答 2

4

我遇到了类似的问题,想重置ServicePointManager并为不同的测试结果更改证书。对我有用的方法是将 MaxServicePointIdleTime 设置为一个低值,这将有效地重置它。

ServicePointManager.MaxServicePointIdleTime = 1;
于 2016-07-19T16:58:55.237 回答
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 地址。

面向对象

于 2012-05-04T21:08:03.923 回答