Web Service学习笔记:类和结构体解析
现在开始学习Web服务,写下自己学习过程中的一些感受,拿出来与大家分享,欢迎批评指正。希望能给跟我一样初学Web服务的朋友一些帮助。
文章在我小站的地址:Web Service学习笔记:类和结构体解析
今天学习了Web服务的类和结构体一节,晚上写下自己所理解的内容,跟大家一起分享了。请批评指正。
Web服务能够把用户定义的类和结构体作为参数或者返回值,但是这里需要记住一些规则,是关于那些类变量可以在Web服务中使用的:
(1)所有类变量必须是基本数据类型或者基本数据类型的数组。
(2)所有类变量必须是公开的或者有一个公开时限的get和set访问器的属性。
为了理解在Web服务中使用类,我做了个实验。创建Web服务,在其中添加一个数组。
string[,] strStuInfo ={
{"200511020120","贰零零五届","人文法律学院","社会工作","(1)班","贺无悔","1"},
{"200511020121","贰零零五届","人文法律学院","社会工作","(1)班","贺梁需","2"},
{"200511010122","贰零零五届","人文法律学院","法律专业","(1)班","贺陆磊","3"},
{"200511010220","贰零零五届","人文法律学院","法律专业","(2)班","贺白灵","4"},
{"200511010221","贰零零五届","人文法律学院","法律专业","(2)班","李剑付","5"},
{"200511020222","贰零零五届","人文法律学院","社会工作","(2)班","李敬意","6"},
{"200511100120","贰零零五届","化工生物学院","生物制药","(1)班","李黄兴","7"},
{"200511100221","贰零零五届","化工生物学院","生物制药","(2)班","李蕾蕾","8"},
{"200511100322","贰零零五届","化工生物学院","生物制药","(3)班","杜白冰","9"},
{"200611120120","贰零零六届","化工生物学院","发酵工程","(1)班","杜书并","10"},
{"200611120121","贰零零六届","化工生物学院","发酵工程","(1)班","杜小鱼","11"},
{"200611120421","贰零零六届","化工生物学院","发酵工程","(4)班","杜声声","12"},
};
下面我们要做的就是添加一个类,第一个类定义StuInfo,由五个字符串、一个StudentInfo类型的数组和一个公共属性组成。公共属性对应了一个私有的字符串。StudentInfo类则由一个名为intStuRank的学生排名和strStuCollege的学生所属学院组成。并添加以下的代码:
{
public string strStuNum;
public string strStuYear;
public string strStuCollege;
public string strStuClass;
public string strStuName;
public StudentInfo[] Information = new StudentInfo[2];
private string strInfo;
public string Info
{
set
{
strInfo = value;
}
get
{
return strInfo;
}
}
public class StudentInfo
{
public int intStuRank;
public string strStuCollege;
}
}
注:其实在真是的程序中,不可能像这样设计。我们不会把一个拥有固定数量的学生信息记录放在StuInfo类中,而很可能需要使用一个集合。我们也可以把数据存储到数据库中,而不是填充一个数组。这样的话,Web方法返回的历史记录的数量则根据数据库查询返回的记录数量决定,这是一个例子,数据使用直接写入的数组,这样可以把精力集中在使用Web服务的类上。
在Web服务中,我们添加GetStuInfo方法,它使用了StuInfo类为传入的strStuNum返回的学生信息的历史数据。代码如下:
public StuInfo GetStuInfo(string strStuNum)
{
StuInfo stuinfo = new StuInfo();
//遍历数组,寻找strStuName
for (int i = 0; i < strStuInfo.GetLength(0); i++)
{
if (String.Compare(strStuInfo[i, 0], strStuNum, true) == 0)
{
stuinfo.strStuNum = strStuNum;
stuinfo.strStuYear = strStuInfo[i, 1];
stuinfo.strStuCollege = strStuInfo[i, 2];
stuinfo.strStuClass = strStuInfo[i, 3];
stuinfo.strStuName = strStuInfo[i, 5];
stuinfo.Info = "通过类返回学生相关信息";
//保存StuInfo数据
stuinfo.Information[0] = new StuInfo.StudentInfo();
stuinfo.Information[0].intStuRank = 5;
stuinfo.Information[0].strStuCollege = "人文法律学院";
stuinfo.Information[1] = new StuInfo.StudentInfo();
stuinfo.Information[1].intStuRank = 3;
stuinfo.Information[1].strStuCollege = "化工生物学院";
return stuinfo;
}
}
stuinfo.strStuNum = strStuNum;
stuinfo.strStuName = "没有找到人员";
return stuinfo;
}
在GetStuInfo方法中,在使用每个类之前都要初始化,遍历strStuInfo数组,找到数据然后返回。类变量是从数组总获得数据的,然后类自身会被返回。如果strStuNum学生学号没有在数组中找到,那么在一个GetStuInfo类的字段中会设置消息,然后被返回。
在浏览器中打开服务,调用GetStuInfo方法,
(1)输入数组中存在的学号(譬如200511020120),将会返回的结果如图:
(2)输入数组中不存在的学号(随便输了),将会返回的结果如图:
在Web服务返回的StuInfo对象中,好像私有字符串strInfo是不可见的。因此,公共方法必须有get和set访问器。如果我们修改了StuInfo类,初始化私有字符串的值,并且去掉set访问器,代码如下:
public string Info
{
get
{
return strInfo;
}
}
然后,我们必须把GetStuInfo方法中给Info属性赋值的代码去掉,因为这个公共属性是只读的。
运行Web服务,然后在GetStuInfo方法中设置断点,来验证返回的StuInfo对象,那么调试器将会显示strInfo属性,但是,strInfo属性不会被Web服务返回,因为他没有被读写。
(一)创建发现文档
一旦创建完成Web服务,负责开发Web服务使用程序的开发人员需要找到一种方法,从而能够了解服务器上有哪些Web服务可用,这些Web服务提供了那些方法,这些方法和属性可接受那些参数,以及这些Web方法的返回值是什么,这个过程叫做发现。
当然这是一个可选的过程,如果使用程序的开发人员了解Web服务文件的URL,那么这就不需要实施发现动作。
(1)利用查询字符串实现发现
开发者可以获得在服务器中的DISCO文件来创建一个客户端应用程序。如果需要查看这个文件,可以在Web服务的文件后面加上?disco,效果如下图:
(2)静态发现文件
如果Web服务的使用程序需要使用静态发现文件,那么Web服务开发人员必须创建一个静态发现文件。
虽然可以手工创建.disco文件,但是使用disco.exe命令行工具远比那样简单的多。打开命令行窗口(这里可不是在运行中打CMD的那个,而是Visual Studio 2008命令提示,从而可以获得正确的路径),然后键入与下面类似的命令(整行命令必须写在一行中):
disco Web服务的地址
如果想看DISCO工具的完整参数清单,键入:disco/? 命令。
(二)预编译程序集
典型的部署目录结构图(没装PS,用VISIO话的,大家将就将就吧)
出处:http://VisualStudio.cnblogs.com/
个人网站:H2站长论坛
本文版权归作者和博客园还有H2站长论坛共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。