Web Service学习笔记:创建一个示例和WebMethod特性解析

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

文章在我小站的地址:Web Service学习笔记:创建一个示例和WebMethod特性解析

Web服务的宗旨是创建不需要用户界面就能与其他应用程序交互的Web应用程序。它是松耦合的,并与服务器端和客户端所使用的操作系统、编程语言都无关,这样就在一定的情况下就会使你的效率大大提高。但创建Web服务必须保证的是,服务器端和客户端都要支持行业标准协议HTTP、SOAP(simple object access protocal 简单对象访问协议)和XML。

创建Web服务的过程:

(1):打开VS,创建一个ASP.NET WEB服务应用程序;

(2):输入下列代码,这是一个有关学生信息的二维数组和几个方法

 

// 构造并填充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 " },
                 };

[WebMethod(Description 
=   " 根据学号获得学生的姓名 " )]
public   string  GetName( string  strStuNum)
{
    
for  ( int  i  =   0 ; i  <  strStuInfo.GetLength( 0 ); i ++ )
    {
        
if  (String.Compare(strStuNum, strStuInfo[i,  0 ],  true ==   0 )
            
return  strStuInfo[i,  5 ].ToString();
    }
    
return   " 您输入的学号不存在 " ;
}

[WebMethod(Description 
=   " 根据学号获得学生的专业和班级 " )]
public   string  GetClass( string  strStuNum)
{
    
for  ( int  i  =   0 ; i  <  strStuInfo.GetLength( 0 ); i ++ )
    {
        
if  (String.Compare(strStuNum, strStuInfo[i,  0 ],  true ==   0 )
        {
            
return  strStuInfo[i,  3 ].ToString()  +  strStuInfo[i,  4 ].ToString();
        }
    }
    
return   " 您输入的学号不存在 " ;
}

[WebMethod(Description 
=   " 根据学号获得学生的入学时间 " )]
public   string  GetYear( string  strStuNum)
{
    
for  ( int  i  =   0 ; i  <  strStuInfo.GetLength( 0 ); i ++ )
    {
        
if  (String.Compare(strStuNum, strStuInfo[i,  0 ],  true ==   0 )
        {
            
return  strStuInfo[i,  1 ].ToString();
        }
    }
    
return   " 您输入的学号不存在 " ;
}

[WebMethod(Description 
=   " 根据学号获得学生的学院 " ]
public   string  GetCollege( string  strStuNum)
{
    
for  ( int  i  =   0 ; i  <  strStuInfo.GetLength( 0 ); i ++ )
    {
        
if  (String.Compare(strStuNum, strStuInfo[i,  0 ],  true ==   0 )
        {
            
return  strStuInfo[i,  2 ].ToString();
        }
    }
    
return   " 您输入的学号不存在 " ;
}

[WebMethod(Description 
=   " 点击次数 " , EnableSession  =   true )]
public   int  HitCounter()
{
    
if  (Session[ " HitCounter " ==   null )
    {
        Session[
" HitCounter " =   1 ;
    }
    
else
    {
        Session[
" HitCounter " =  (( int )Session[ " HitCounter " ])  +   1 ;
    }
    
return  (( int )Session[ " HitCounter " ]);
}

 

(3)生成Web服务,在浏览器中打开(效果如下)

 

(4)创建个其他程序,调用就可以了!

 

 

WebMethod特性的EnableSession属性

此属性默认为false。如果设置为true,web方法将会启用会话状态,且继承自WebService类,那么会话状态集合可以使用WebService.Session属性访问,如果没有集成,则可以直接从HttpContext.Current.Session访问。

上面代码中HitCounter()方法为每个会话准备了单击计数器。

会话状态为应用程序增加了额外的开销,如果移除会话状态可以提高性能。然而,会话状态作为全局变量很有用,因为它能够超出成员变量的工作范围。

需要注意的是:会话状态在Web服务中是通过cookies实现的,如果传输机制不是HTTP的话,则不可用。

 

WebMethod特性的MessageName属性

Web服务禁止使用函数重载。MessageName属性可以解决由多个相同的名称的方法造成的无法识别的问题,它允许对每一个方法的重载使用唯一的别名。当从在方法在SOAP消息中引用时,SOAP将使用MessageName而非方法名。

在上面的例子中,为了试验这个属性,我改了一下,写两个GetCollege()方法。

 

 

       [WebMethod(Description  =   " 根据学号获得学生的学院 " , MessageName  =   " GetCollegeStuNum " )]
        
public   string  GetCollege( string  strStuNum)
        {
            
for  ( int  i  =   0 ; i  <  strStuInfo.GetLength( 0 ); i ++ )
            {
                
if  (String.Compare(strStuNum, strStuInfo[i,  0 ],  true ==   0 )
                {
                    
return  strStuInfo[i,  2 ].ToString();
                }
            }
            
return   " 您输入的学号不存在 " ;
        }

        [WebMethod(Description 
=   " 根据排名获得学生的学院 " , MessageName  =   " GetCollegeStuRank " )]
        
public   string  GetCollege( int  intStuRank)
        {
            
for  ( int  i  =   0 ; i  <  strStuInfo.GetLength( 0 ); i ++ )
            {
                
if  (String.Compare(intStuRank.ToString(), strStuInfo[i,  6 ],  true ==   0 )
                {
                    
return  strStuInfo[i,  2 ].ToString();
                }
            }
            
return   " 您输入的学生排名不存在 " ;
        }

 

 

可是当你从新生成的时候,会发现不会在报错了,但是在浏览器打开时,却会出现下面的问题。

 

 

后来看书发现了这个问题的原因在于:

由于默认WebServiceBinding特性遵循WS-1 BP V1.1,如果两个方法处于相同的数据绑定,那么该规范不允许方法的重载(尽管使用了MessageName属性)可以做两种选择:

(1)重命名方法,当然用这种方法最好是客户端没有链接到Web服务。

(2)创建一个新的绑定来代特重载方法

做法如下:

1)为类添加新的属性(文件的摘要下面),代码如下:

 

 

[WebService(Namespace  =   " http://tempuri.org/ " )]
[WebServiceBinding(ConformsTo 
=  WsiProfiles.BasicProfile1_1, Name  =   " OverloadedGetCollege " ,EmitConformanceClaims = true )]
[ToolboxItem(
false )]

 


多添加了这个两个属性:Name = "OverloadedGetCollege",EmitConformanceClaims=true

 

2)在任意一个GetCollege()方法上部添加SoapDocumentMethod特性:

        [SoapDocumentMethod(Binding="OverloadedGetCollege")]
        [WebMethod(Description = "根据学号获得学生的学院", MessageName = "GetCollegeStuNum")]
        public string GetCollege(string strStuNum)

3)重新生成,就成功了。效果如下:

 

想了解这样的好处,点击如上图的“服务说明”,就可以看到WSDL的变化,我也就不多说了!

 

 

转载于:https://www.cnblogs.com/VisualStudio/archive/2008/10/11/1308541.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值