首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

8.3  使用HTTP测试Web方法

问题

如何使用HTTP通过调用Web service的Web方法对其进行测试。

设计

创建一个指向待测Web方法的HTTPWebRequest对象,使用GetResponse()方法发送对应于“形参-实参(parameter-argument)”的“名称-值”序列,然后通过GetResponseStream()方法取回响应。

方案

这个例子发送字符串“testing”到Web方法GetTitles():

Console.WriteLine("Calling Web Method GetTitles() using HTTP");

string input = "testing";

string postData = "filter=" + input;

byte[] buffer = Encoding.ASCII.GetBytes(postData);

string uri =

"http://localhost/TestAuto/Ch8/TheWebService/BookSearch.asmx/GetTitles";

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);

req.Method = "POST";

req.ContentType = "application/x-www-form-urlencoded";

req.ContentLength = buffer.Length;

req.Headers.Add("SOAPAction: \"http://tempuri.org/GetTitles\"");

req.Timeout = 5000;

Stream reqst = req.GetRequestStream(); // 向request流中加入表单数据

reqst.Write(buffer, 0, buffer.Length);

reqst.Flush();

reqst.Close();

HttpWebResponse res = (HttpWebResponse)req.GetResponse();

Stream resst = res.GetResponseStream();

StreamReader sr = new StreamReader(resst);

string response = sr.ReadToEnd();

Console.WriteLine("HTTP response is " + response);

Console.WriteLine("\nDetermining pass/fail");

if ( response.IndexOf("002") >= 0 &&

      response.IndexOf("004") >= 0 &&

      response.IndexOf("005") >= 0 )

  Console.WriteLine("\nPass");

else

Console.WriteLine("\nFail");

sr.Close();

resst.Close();

因为ASP.NET Web service是基于HTTP协议的,所以可以使用HttpWebRequest类直接向Web方法发送数据。Web方法期望值的数据格式是“名称-值”组成的序列,例如:

filter=testing

在这里,名称部分就是Web方法的参数名称,值部分就是参数的取值。HttpWebRequest.GetResponse()方法返回一个HttpWebResponse对象,这个对象有一个GetResponseStream()方法可以用来以字符串的形式读取响应数据。

注解

用于测试ASP.NET Web service的4种主要方法中,使用HTTP这种方式,其所进行的操作在中间的抽象层次上。这种技术在简单性和灵活性之间提供了很好的折中。与8.2节所描述的如何生成一个SOAP请求模板类似,我们也可以通过让Visual Studio运行Web service生成一个HTTP请求模板。

根据Web service所在的服务器上的特定配置,可能需要(也可能不需要)添加特殊的SOAPAction报头:

req.Headers.Add("SOAPAction: \"http://tempuri.org/GetTitles\"");

从实践上来看,简单的做法是一开始就试着给请求加上报头,因为服务器通常会忽略掉不能识别的报头。用于发送HTTP数据的模式是相当简单的:首先创建一个“名称-值”所组成的字符串,它对应于Web方法的“形参-实参”,然后把要发送的字符串转换成字节数组。接下来,通过WebRequest.Create()方法所提供的工厂机制(而不采用new关键字进行实例化)创建一个HttpWebRequest对象,然后为Method、ContentType和ContentLength属性指定属性值。再接下来,通过把POST数据写入Stream对象发送HTTP请求(这里并不需要显式地使用类似于Write()的方法),然后通过一个StreamReader对象取回响应。通过研究像上述方案所提供的具体例子(而不是那些泛泛的原理)可以更好地理解这个过程。

正如8.2节所讨论的那样,判断受测Web方法通过与否比调用它要更为困难。一种好的策略是,尽可能地组织好后台数据库的测试数据,从而让这些数据更容易被确定并且被唯一确定。但这种方法并不总是可行的,这时候,必须依赖于手工测试作为自动化测试的补充。使用HTTP调用Web方法的关键是,通过程序向Web服务器发送数据;其他与此相关的技术请参见第5章。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论