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

      平时写Web Service时经常会对Service的访问进行安全控制,方法很多,这里介绍一下如何用Soap头来进行控制的一例。
      第一步,引用需要用到的名称空间

using System;
using System.Xml;
using System.Xml.Serialization;
using System.Web.Services;
using System.Web.Services.Protocols;
      
      第二步,建立自定义的SoapHeader类MySoapHeader
public class MySoapHeader : SoapHeader
{
    
string _name;
    
string _passWord;

    
public string Name
    
{
        
get return _name; }
        
set { _name = value; }
    }

    
public string PassWord
    
{
        
get return _passWord; }
        
set { _passWord = value; }
    }

}

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

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

        }

        
//业务逻辑.
        return "Something done";
    }

}

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

        
catch (SoapHeaderException soapEx)
        
{
            Console.WriteLine(
"Soap Header Exception:" + soapEx.Message);
        }

        
catch (Exception ex)
        
{
            Console.WriteLine(
"Exception:" + ex.Message);
        }

    }

}

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

posted on 2007-04-10 20:30 David Fan 阅读(5648) 评论(20)  编辑 收藏 网摘 所属分类: WebService

评论

#1楼 2007-04-10 20:36 yyww      

不错。期待下篇   回复  引用  查看    

#2楼 2007-04-10 20:44 大豆男生      

很好!   回复  引用  查看    

#3楼 2007-04-10 21:23 Clark Zheng      

mark   回复  引用  查看    

#4楼 2007-04-10 21:25 shenfx      

有一点茫然,为什么会由客户端调用CheckHeader()方法呢?
我认为应当客户端提供身份凭证,在服务器端进行验证吧,服务器调用CheckHeader(),如果验证通过,才允许客户端调用其他的业务方法。
  回复  引用  查看    

#5楼[楼主] 2007-04-10 22:06 David.Fan      

ClientMethod里的MyService和MySoapHeader实际上是服务器对应类的代理   回复  引用  查看    

#6楼 2007-04-10 22:32 DrkBreeze's Bolg      

这个soap header在传输过程中仍然是明文传输,这样验证有作用吗?   回复  引用  查看    

#7楼[楼主] 2007-04-10 22:46 David.Fan      

@DrkBreeze's Bolg
这篇文章主要是想对Soap Header的用法做一个介绍和举例。
再一其实这就像网页上的表单登陆,它也是用明文传输你输入的信息,你说它不安全我完全同意,但是你能说它没用吗?
  回复  引用  查看    

#8楼[楼主] 2007-04-10 23:09 David.Fan      

@DrkBreeze's Bolg
我想这样明文传输也不太好,我在下一篇Soap扩展里再写一下解决的办法。谢谢关注!
  回复  引用  查看    

#9楼 2007-04-11 09:25 czy[未注册用户]

service.header = h;

这点应该改为
service.MySoapHeaderValue = h;
  回复  引用    

#10楼[楼主] 2007-04-11 09:36 David.Fan      

@czy
嗯,最后一步大家不要误解。实际的类名和类的属性并不和原类相同。会有所区别,但是一定可以对应上。我之所以这样写,是想让大家看明白,客户端调用的就是服务器上对应类的代理。
  回复  引用  查看    

#11楼 2007-04-11 09:55 虚拟主机[未注册用户]

呵呵,有用就好!   回复  引用    

#12楼 2007-04-11 09:56 域名注册[未注册用户]

呵呵这个东西写的不错。   回复  引用    

#13楼 2007-07-04 12:56 sekihin      

正在找webService的资料,一下踩到这里,受益匪浅   回复  引用  查看    

#14楼 2008-02-27 10:38 成长的强强      

请教,这样做的话,有什么意义?
这样和直接写一个验证的方法有什么不一样吗?

如何才能做到,加密传输的数据呢?而不是直接的XML
  回复  引用  查看    

#15楼 2008-07-14 14:51 陈晨      

--引用-------------------------------------------------- shenfx: 有一点茫然,为什么会由客户端调用CheckHeader()方法呢?我认为应当客户端提供身份凭证,在服务器端进行验证吧,服务器调用CheckHeader(),如果验证通过,才允许客户端调用其他的业务方法。 --------------------------------------------------------

客户端调用的CheckHeader(),实际上是客户端通过代理类在调用服务器端的方法
  回复  引用  查看    

#16楼 2008-12-04 16:41 min10      

转载了   回复  引用  查看    

#17楼 2009-05-21 16:09 cnmska[未注册用户]

好<span style="color: red">hoho</span>   回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 707684




相关文章:

相关链接:

导航

公告

本Blog内容属本人学习与工作经验之总结。欢迎大家交流经验。请不要发广告链接和与主题无关的回复。谢谢!本人联系方式David.bj(at)hotmail.com
吃完饭就困呀!!
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

与我联系

搜索

 

留言簿

随笔分类