3

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.dllSystem.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 が変更される可能性はありますか?

次に、次の手順を実行しました。

  1. ラップトップでアクティブ化された Windows
  2. 再起動しました
  3. Windows Update を実行したところ、すべてが最新の状態であることがわかりました。
  4. プロジェクト シナリオを実行したところ、同じ例外がまだスローされていることがわかりました。
4

2 に答える 2

1

おそらく、一方のマシンには .NET 4.5 があり、もう一方のマシンにはありません。VS2012 をメイン ワークステーションにインストールしましたか?

このバグは .NET 4.5 で修正されました。

http://connect.microsoft.com/VisualStudio/feedback/details/618568/smtpclient-and-dispose-without-a-hostname-gives-invalidoperationexception

また、.NET 4.5 をインストールすると、既存の .NET 4.0 dll の上に新しい DLL が上書きされます。

http://www.west-wind.com/weblog/posts/2012/Mar/13/NET-45-is-an-inplace-replacement-for-NET-40

于 2012-10-29T20:59:34.143 に答える
0

IIRC、フレームワークへのサービス パックは、アセンブリのバージョンを上げません。私が間違っているかもしれませんが、最初にチェックするのは、各マシンのサービス パック レベルです。

もちろん、サービス パックほど明確に表示されない修正プログラムもあります...

于 2012-08-03T16:48:24.923 に答える