我正在创建一个小型测试应用程序,它将运行几个测试用例来检查我们系统各个组件的状态。该应用程序创建为.NET Windows窗体应用程序,并带有几个复选框,用于检查每个通过的测试用例(如果失败则不检查)。如何使用异步调用来检查Web服务是否可用
其中一项测试是检查简单web服务的可用性。如果Web服务可用,则测试用例将成功,否则失败。我首先尝试通过使用System.Net.HttpWebRequest类来完成此任务,将超时设置为1500毫秒并调用GetResponse。现在,如果web服务不可用,请求应该超时并且测试用例失败。然而,事实证明,超时是在web服务的实际响应上设置的。也就是说,超时从开始建立web服务的连接时开始计算。如果Web服务无法访问,则不会发生超时,因此在测试用例失败之前至少需要30秒。
为了解决这个问题,我建议使用BeginGetResponse和请求完成时的回调进行异步调用。现在,这里也会出现同样的问题,因为如果web服务不可用,则至少需要30秒,直到发生回调。
现在我在想我可以使用System.Timers.Timer,将超时设置为1500毫秒,并在计时器超时时发生事件。问题是,定时器会超时,无论Web服务是否可访问,因此事件将被触发,而不管Web服务是否可访问。
现在我没有想法。我意识到这必须是一个相当容易解决的问题。有没有人有任何建议,我怎么能做到这一点?
我收到了在自己的线程中进行调用的建议。所以现在我在自己的线程中执行请求。但是,如果请求没有响应,则当我试图将测试状态设置为失败时,应用程序会锁定。但是如果它有回应,我可以设置测试状态以成功解决任何问题。代码为:
private void TestWebServiceConnection()
{
HttpWebRequest request;
request = (HttpWebRequest)WebRequest.Create(Url);
request.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);
System.Threading.Thread.Sleep(1500);
SetStatusDelegate d = new SetStatusDelegate(SetTestStatus);
if (request.HaveResponse)
{
if (ConnectionTestCase.InvokeRequired)
{
this.Invoke(d, new object[] { TestStatus.Success});
}
}
else
{
if (ConnectionTestCase.InvokeRequired)
{
this.Invoke(d, new object[] { TestStatus.Failure });
}
}
}
private delegate void SetStatusDelegate(TestStatus t);
private void SetTestStatus(TestStatus t)
{
ConnectionTestCase.Status = t;
}
ThreadStart ts = new ThreadStart(TestWebServiceConnection);
Thread t = new Thread(ts);
t.Start();
任何意见,为什么我得到这种行为?感谢名单!
我跟着你的意见,并在一个单独的线程上打电话。在我调用thread.start()之后,我让应用程序休眠了一秒钟。如果未收到响应,则测试默认为失败。感谢您的帮助! – 2010-02-04 07:25:33