WebService开发(一) 如何使用Soap头

平时写Web Service时经常会对Service的访问进行安全控制,方法很多,这里介绍一下如何用Soap头来进行控制的一例。
      第一步,引用需要用到的名称空间
None.gif using  System;
None.gif
using  System.Xml;
None.gif
using  System.Xml.Serialization;
None.gif
using  System.Web.Services;
None.gif
using  System.Web.Services.Protocols;
      
      第二步,建立自定义的SoapHeader类MySoapHeader
None.gif public   class  MySoapHeader : SoapHeader
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
string _name;
InBlock.gif    
string _passWord;
InBlock.gif
InBlock.gif    
public string Name
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _name; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _name = value; }
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public string PassWord
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _passWord; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _passWord = value; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

      第三步,建立WebSerivce,MyService类有一个MySoapHeader类型的字段公共header,在客户调用CheckHeader之前需要给header付一个新实例,服务器端检验这个实例的成员信息。失败我们抛出一个SoapHeaderException,这个异常的新实例,这里调用两个参数的构造函数。第一个参数是自定义的异常原因,第二个参数我们用SoapException.ClientFaultCode表示客户的调用格式不正确或缺少必要的信息。
None.gif [WebService(Namespace  =   " http://DavidFan.cnblogs.com " )]
None.gif
public   class  MyService : System.Web.Services.WebService
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public MySoapHeader header;
InBlock.gif    [SoapHeader(
"header", Direction = SoapHeaderDirection.In)]
InBlock.gif    
public string CheckHeader()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (header == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
else
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (header.Name != "admin" || header.PassWord != "admin")
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif        
//业务逻辑dot.gifdot.gif.
InBlock.gif
        return "Something done";
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

      第四步,客户端进行调用,这里的MySoapHeader,和MyService类即为WSDL工具生成代理类,对应服务端的上两个类。我们首先new 一个MySoapHeader的新实例,然后付个Myservice的新实例的header字段,最后调用CheckHeader这个服务器的方法,CheckHeader方法的header!=null,接着进行Name和PassWord的验证。
客户端try-catch块内首先捕获SoapHeaderException(如果有的话)。然后捕获Exception。好了整个过程只需这几步。
None.gif public   class  ServiceClient
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
protected void ClientMethod(string name, string passWord)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        MySoapHeader h 
= new MySoapHeader();
InBlock.gif        h.Name 
= name;
InBlock.gif        h.PassWord 
= passWord;
InBlock.gif        MyService service 
= new MyService();
InBlock.gif        service.header 
= h;
InBlock.gif        
try
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
string retval = service.CheckHeader();
InBlock.gif            Console.WriteLine(
"Return:" + retval);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
catch (SoapHeaderException soapEx)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"Soap Header Exception:" + soapEx.Message);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"Exception:" + ex.Message);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

      到些为止,利用Soap头的一例简单的介绍完了,扩展应用,就由大家来发挥吧!
    

转载于:https://www.cnblogs.com/wayne-ivan/archive/2007/06/19/788539.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值