WCF問題集錦:基礎接続が閉じて受信した時にエラーが発生
3311 ワード
今日、ユニットテストを行うと、2番目のテストクラスに実行されたとき、これまでエラーのなかったテストが、ベース接続が閉じて受信されたときにエラーが発生したと報告されました.今日唯一変更されたのは、テストコードに次の2つの実行体が追加されていることです.
そして、手動で1つ1つのテストクラスを実行すると、すべて良いです.問題が確かに上記のコードの実行によるものであることを確認するために、上のコードをログアウトしてから再び全体的に実行し、間違いを報告しなかった.再びコードを加えて、全体的に実行して、エラーを報告して、上の2つを繰り返して、すべて同じ現象です.問題の原因を特定するのは、このシステムの時間調整によるものです.
手動で実行すれば問題ないと思うのは、システム実行中に前のクラスのリカバリ時間から次のクラスの調整時間まで、すぐに実際のテストコードを呼び出し、サービス側(開発環境テストコードとサービス側が同じコンピュータ上)のコード実行時にシステム時間が錯乱し、タイムアウトなどの時間の原因で、最後に接続を閉じる可能性があるからだと推測します.そこで,シミュレーション手動操作を決定し,調整と復帰時間後,1秒の遅延を加えて具体的な試験方法を実行する.テストを経て、問題が解決した.
システム時間調整コードは以下の通りです.
[TestFixtureSetUp]
public void Set()
{
CommonFuns.SetTime();
}
[TestFixtureTearDown]
public void Restore()
{
CommonFuns.RestoreTime();
}
において、Setはシステムの現在の時間を所定の値に設定するために使用され、Restoreはシステムの時間を回復するために使用される.そして、手動で1つ1つのテストクラスを実行すると、すべて良いです.問題が確かに上記のコードの実行によるものであることを確認するために、上のコードをログアウトしてから再び全体的に実行し、間違いを報告しなかった.再びコードを加えて、全体的に実行して、エラーを報告して、上の2つを繰り返して、すべて同じ現象です.問題の原因を特定するのは、このシステムの時間調整によるものです.
手動で実行すれば問題ないと思うのは、システム実行中に前のクラスのリカバリ時間から次のクラスの調整時間まで、すぐに実際のテストコードを呼び出し、サービス側(開発環境テストコードとサービス側が同じコンピュータ上)のコード実行時にシステム時間が錯乱し、タイムアウトなどの時間の原因で、最後に接続を閉じる可能性があるからだと推測します.そこで,シミュレーション手動操作を決定し,調整と復帰時間後,1秒の遅延を加えて具体的な試験方法を実行する.テストを経て、問題が解決した.
システム時間調整コードは以下の通りです.
using System.Runtime.InteropServices;
namespace VME.UnitTest.Service
{
public class SystemTimer
{
//imports SetLocalTime function from kernel32.dll
[DllImport("kernel32.dll", SetLastError = true)]
public static extern int SetLocalTime(ref SystemTime lpSystemTime);
//struct for date/time apis
public struct SystemTime
{
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;
}
}
}
public static void SetTime()
{
SetTime(0);
}
public static void RestoreTime()
{
RestoreTime(0);
}
///
/// 15 5
///
public static void SetTime(int day)
{
_diffHours = 0;
if (DateTime.Now.Hour > 15)
{
_diffHours = 5;
// And then set up a structure with the required properties and call the api from code:
SystemTimer.SystemTime systNew = new SystemTimer.SystemTime();
//
systNew.wDay = Convert.ToInt16(DateTime.Now.AddDays(day).Day);
systNew.wMonth = Convert.ToInt16(DateTime.Now.Month);
systNew.wYear = Convert.ToInt16(DateTime.Now.Year);
systNew.wHour = Convert.ToInt16(DateTime.Now.Hour - _diffHours);
systNew.wMinute = Convert.ToInt16(DateTime.Now.Minute);
systNew.wSecond = Convert.ToInt16(DateTime.Now.Second);
// API,
SystemTimer.SetLocalTime(ref systNew);
Thread.Sleep(1000);
}
}
///
///
///
public static void RestoreTime(int day)
{
if (_diffHours > 0)
{
// And then set up a structure with the required properties and call the api from code:
SystemTimer.SystemTime systNew = new SystemTimer.SystemTime();
//
systNew.wDay = Convert.ToInt16(DateTime.Now.AddDays(day).Day);
systNew.wMonth = Convert.ToInt16(DateTime.Now.Month);
systNew.wYear = Convert.ToInt16(DateTime.Now.Year);
systNew.wHour = Convert.ToInt16(DateTime.Now.Hour + _diffHours);
systNew.wMinute = Convert.ToInt16(DateTime.Now.Minute);
systNew.wSecond = Convert.ToInt16(DateTime.Now.Second);
// API,
SystemTimer.SetLocalTime(ref systNew);
_diffHours = 0;
Thread.Sleep(1000);
}
}