2

System.Net.Mail.SMTPClient がローカル IP バインドを行う方法で指定されたコードと同様のコードをたどろうとしています。複数の 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 アドレスを選択できます。

OO

于 2012-05-04T21:08:03.923 に答える