R#7 ありがとうございます。彼らの新しい「逆コンパイルされたソースに移動」機能がなければ、この問題をどのように説明するか途方に暮れるでしょう。
しばらくの間、特定の SmtpMailSender 実装クラスがありました。これが行うことのいくつかを次に示します。
1.) 開発モードではネットワーク メールを送信しません。開発中の web.config は次のようになります。
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="App_Data/mail" />
</smtp>
<!--<smtp deliveryMethod="Network">
<network host="smtp.roadrunner.com" />
</smtp>-->
メール送信クラスはSmtpClient.DeliverMethod
プロパティを盗聴し、の実際のランタイム パスをSmtpClient.PickupDirectoryLocation
(のようなものに"C:\path\to\project\App_Data\mail"
) 構成します。
2.) すべての送信コードを using ステートメントと try ブロックにラップします。
...
try
{
using (var smtpClient = new SmtpClient())
{
// detect pickup directory
// do other encapsulated behaviors
smtpClient.Send(message);
}
}
catch (Exception ex)
{
_exceptionLogger.LogException(ex);
if (++retryCount > 2) throw;
Thread.Sleep(3000);
Send(message, retryCount); // recursive to same method
}
これは、昨年から私のメインワークステーションでうまく機能しています。ただし、プロジェクトをラップトップにダウンロードしたところ、すべてSmtpClient.Send(MailMessage)
が次の例外を引き起こしていることがわかりました。
InvalidOperationException: "The SMTP host was not specified."
at System.Net.Mail.SmtpClient.CheckHostAndPort()
at System.Net.Mail.SmtpClient.get_ServicePoint()
at System.Net.Mail.SmtpClient.Dispose(Boolean disposing)
at System.Net.Mail.SmtpClient.Dispose()
at My.ImplementationOf.SmtpMailSender.Send(MailMessage message, Int32 retryCount)
から例外がスローされていました。これは、ラップトップの R# 逆コンパイルに従ってSmtpClient.CheckHostAndPort
、プロパティが null または長さがゼロの場合にスローされます。SmtpClient.Host
ワークステーションに戻ると、プロパティが null であったにもかかわらずsmtpClient.Host
、この例外がスローされていないことがわかりました。
次に、ワークステーションで R# の小さな逆コンパイル機能を使用System.Net.Mail.SmtpClient
したところ、このクラスには 2 つの異なる実装があることがわかりました。C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.dll
System.dll への参照が両方のマシンで指しているため、非常に奇妙です! 基本的には同じですが、重要な違いが 1 つあります。
protected virtual void Dispose(bool disposing)
{
// the workstation decompilation shows this:
if (this.transport != null && this.servicePoint != null)
this.transport.CloseIdleConnections(this.servicePoint);
// but the laptop decompilation shows this:
if (transport != null)
transport.CloseIdleConnections(ServicePoint);
}
これの 2 つの異なる実装がどのように存在するのでしょうか?
アップデート
両方のマシンで Windows 7 Professional Service Pack 1 が表示されています。両方で Windows Update を実行したところ、どちらもコンピューターが最新であると表示されました。私が考えることができる唯一の違いは、ラップトップの Windows 7 がまだアクティブになっていないことです。3 日前にインストールしたばかりです。OS のアクティベーションによって、フレームワークの System.dll が変更される可能性はありますか?
次に、次の手順を実行しました。
- ラップトップでアクティブ化された Windows
- 再起動しました
- Windows Update を実行したところ、すべてが最新の状態であることがわかりました。
- プロジェクト シナリオを実行したところ、同じ例外がまだスローされていることがわかりました。