WebService开发 使用Soap

来源:互联网 发布:小米笔记本12.5java 编辑:程序博客网 时间:2024/05/15 07:06

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扩展!谢谢大家!
转载:http://www.cnblogs.com/DavidFan/archive/2007/04/10/707684.html

WebService开发(二) 如何使用Soap扩展

      SOAP Extension(SOAP扩展)可以封装可重用的功能。比如上一篇讲的通过Soap Header进行服务的访问控制。这篇随笔里我们要利用SOAP扩展做一下对利用Soap Header校验用户身份的封装和解决网友提出的明文传输身份信息不安全的问题。
      首先,介绍一下几个相关的类。System.Web.Services.Protocols名称空间下SoapExtension,SoapExtensionAttribute是两个抽象类,不能够实例化,我们要做的事情就是分别继承这两个抽象类,实现自定义类。SoapExtensionAttribute又继承自System.Attribute,说明它是一个Attribute(这个东西不太好翻译,有人译成属性之类,我考虑了一下,感觉翻译成标签更形象,为什么呢?我们用这种类时,一般会在类或方法等上方加[Attribute],这就有点像给东西贴一个标签,告诉别人这个有什么特征,作什么用途)。
      我们开始实现自定义的SoapExtension和SoapExtensionAttribute,下边是具体代码,代码中用到了对称加密,我封装了一下MSDN里的提供的一个实现,可以下载源文件在这里/Files/DavidFan/Encryptor.rar。需要引用的名称空间,其中包括我封装的加密类所在的名称空间
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Services.Protocols;
using David.Fan.Encrypt;
      下边是自定义的MyExtensionAttribute类,[AttributeUsage(AttributeTargets.Method)]中AttributeTargets.Method是只可以对方法应用,当然你还可以根据Soap扩展的不同功能,设置其它的应用类型。
[AttributeUsage(AttributeTargets.Method)]
public class MyExtensionAttribute : SoapExtensionAttribute
{
    int _priority = 1;

    public override int Priority
    {
        get { return _priority; }
        set { _priority = value; }
    }


    public override Type ExtensionType
    {
        get { return typeof(MyExtension); }
    }

}
      接下来是MyExtension类,继承自SoapExtension
public class MyExtension : SoapExtension
{
    //这个override的方法会被调用四次
    //分别是SoapMessageStage的BeforeSerialize,AfterSerialize,BeforeDeserialize,AfterDeserialize
    public override void ProcessMessage(SoapMessage message)
    {
        if (message.Stage == SoapMessageStage.AfterDeserialize)//反序列化之后处理
        {
            bool check = false;
            foreach (SoapHeader header in message.Headers)
            {
                if (header is MySoapHeader)
                {
                    MySoapHeader myHeader = (MySoapHeader)header;
                    //解密
                    myHeader.Name = Security.Decrypt(myHeader.Name);
                    myHeader.PassWord = Security.Decrypt(myHeader.PassWord);

                    if (myHeader.Name == "admin" || myHeader.PassWord == "admin")
                    {
                        check = true;
                        break;
                    }

                }

            }

            if (!check)
                throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode);
        }

    }

    public override Object GetInitializer(Type type)
    {
        return GetType();
    }

    public override Object GetInitializer(LogicalMethodInfo info, SoapExtensionAttribute attribute)
    {
        return null;
    }

    public override void Initialize(Object initializer)
    {
    }

}
      最后一步如何应用Soap扩展。很简单只需[MyExtensionAttribute]即可。这里用到了SoapHeader,如果你对它不是很熟悉的话,可以参考我的上一篇随笔。
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; }
    }

}

[WebService(Namespace = "http://DavidFan.cnblogs.com")]
public class MyService : System.Web.Services.WebService
{
    public MySoapHeader header;

    [MyExtensionAttribute]
    [SoapHeader("header", Direction = SoapHeaderDirection.In)]
    public string CheckHeader()
    {
        //业务逻辑.
        return "Something done";
    }

}

      CheckHeader方法的实现你可以和我上一篇的MyService的CheckHeader方法作一下对比。就看出来Soap扩展的一点好处了。客户端将身份信息加密传送。服务器端拿到加密串进行解密,然后校验,不匹配则摆出异常。
      这里只是对Soap扩展使用的一个特别的简单的举例,当然你还可以发挥,比如压缩消息,日志记录,Trace之类,网上也有很多文章讲。谢谢大家!

转载:http://www.cnblogs.com/DavidFan/archive/2007/04/11/707781.html

WebService开发(三)Web Service Software Factory

      想了解它是什么?http://www.codeplex.com/servicefactory这里来看。
      想要用上它,先安装dotnetfx3.exe,GuidanceAutomationExtensions.msi,Web Service Software Factory - December 2006 (refresh).msi,微软有提供下载,搜一下就找到了。安装好后,新建项目如下
      Guidance Packages下还有一个wcf的项目模板,恰好最近园子里有人在讲一系列WCF的文章。下一步

      看一下生成的解决方案结构

      作为WebService的最佳实践,微软建议我们解决方案大概就是这个样子了。主要我们还是看好它的引用关系,这对理解这个框架是最好的方法。
      1.BusinessLogic(业务逻辑)引用BusinessEntities(业务实体)和DataAccess(数据访问层)。
      2.ServiceContracts(服务契约)引用DataTypes(数据类型)。ServiceContracts这里通常是接口的定义,我们将[WebService],[WebMethod]应用于接口和接口内方法之上,让任何类继承接口并实现,.asms文件利用<%@ WebService Language="C#" Class="实现接口的类" %>来对外发布服务。来实现操作定义(服务契约)和操作实现的分离。
      3.ServiceImplementation(服务实现)引用BusinessEntities(业务实体),BusinessLogic(业务逻辑),ServiceContracts(服务契约)和DataTypes(数据类型)这四个层。ServiceImplementation内利用“翻译器”将DataTypes(数据类型)和BusinessEntities(业务实体)这两层进行转换,以达到服务涉及类型的松耦合。还有一个原因就是业务层的的业务对象(DataType)可能和持久层(BusinessEntities)或者数据层(DataAccess)的存储大相径庭。
      4.WebService.Host引用ServiceImplementation,对外发布服务。
      
     它提供了一个叫EmployeeService的示例解决方案,大家可以研究一下。

转载:http://www.cnblogs.com/DavidFan/archive/2007/04/15/711225.html

0 0
原创粉丝点击