【发布时间】:2012-05-09 19:57:22
【问题描述】:
我正在创建一个小型测试应用程序,它将通过几个测试用例来检查我们系统各个组件的状态。该应用程序被创建为一个带有几个复选框的 .NET Windows 窗体应用程序,这些复选框为每个通过的测试用例检查(如果失败则不检查)。
其中一项测试是检查简单 Web 服务的可用性。如果 web 服务可用,则测试用例成功,否则失败。我首先尝试通过使用 System.Net.HttpWebRequest 类来完成此操作,将超时设置为 1500 毫秒并调用 GetResponse。现在,如果 web 服务不可用,请求应该超时并且测试用例失败。然而,事实证明,超时设置在来自 web 服务的实际响应中。也就是说,超时从与webservice的连接建立起开始计时。如果 web 服务根本无法访问,则不会发生超时,因此至少需要 30 秒直到测试用例失败。
为了解决这个问题,建议我使用 BeginGetResponse 进行异步调用,并在请求完成时进行回调。现在,同样的问题出现在这里,因为如果webservice不可用,至少需要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();
关于我为什么会出现这种行为的任何建议?谢谢!
【问题讨论】:
标签: c# .net web-services