Web Service学习笔记:类和结构体解析

现在开始学习Web服务,写下自己学习过程中的一些感受,拿出来与大家分享,欢迎批评指正。希望能给跟我一样初学Web服务的朋友一些帮助。

 

文章在我小站的地址:Web Service学习笔记:类和结构体解析

 

今天学习了Web服务的类和结构体一节,晚上写下自己所理解的内容,跟大家一起分享了。请批评指正。

 

Web服务能够把用户定义的类和结构体作为参数或者返回值,但是这里需要记住一些规则,是关于那些类变量可以在Web服务中使用的:

(1)所有类变量必须是基本数据类型或者基本数据类型的数组。

(2)所有类变量必须是公开的或者有一个公开时限的get和set访问器的属性。

为了理解在Web服务中使用类,我做了个实验。创建Web服务,在其中添加一个数组。

 

        //构造并填充info数组
        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 class StuInfo
    
{
        
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返回的学生信息的历史数据。代码如下:

 

 

        [WebMethod(Description = "通过类返回学生信息的历史数据")]
        
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访问器,代码如下:

 

 

        private string strInfo = "类中初始化私有变量的值";
        
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话的,大家将就将就吧)

 

 

posted @ 2008-10-13 21:09  瞪着你的小狗  阅读(2020)  评论(4编辑  收藏  举报