2010年2月24日星期三

IssueVision学习 4/n 自定义WebService 的Soap 头部

SOAP 标头提供了一种方法,用于将数据传递到 XML Web services 方法或从 XML Web services 方法传递数据,条件是该数据不直接与 XML Web services 方法的主功能相关。例如,一个 XML Web services 可能包含若干个 XML Web services 方法,而每个方法都需要自定义的身份验证方案。您不用将参数添加到每个需要自定义身份验证方案的 XML Web services 方法,而可以将引用从 SoapHeader 派生的类的 SoapHeaderAttribute 应用于每个 XML Web services 方法。从 SoapHeader 派生的类的实现处理该自定义身份验证方案。按照此方式,XML Web services 方法使用 SOAP 标头来仅实现特定于它的功能并添加其他功能。

下面的列表概述接收和处理 SOAP 标头的基本步骤: 

1。创建一个从 SoapHeader 派生的类,表示传入 SOAP 标头的数据。

2。将一个成员添加到实现 XML Web services 的类或 XML Web services 客户端代理类(它们属于在第一步创建的类型)。

3。指定第二步中在 MemberName 属性中创建的成员,将 SoapHeaderAttribute 应用于 XML Web services 方法或代理类中的对应方法。

4。在 XML Web services 方法或 XML Web services 客户端代码中访问 MemberName 属性,以处理在 SOAP 标头中发送的数据。

下面的 MyWebService XML Web services 定义 MyHeader SOAP 标头,并要求它随同对 MyWebMethod XML Web services 方法的任意调用一起发送。另外,MyWebMethod 还接收 MyHeader SOAP 标头以外的任何 SOAP 标头

<%@ WebService Language="C#" Class="MyWebService"%>

using System.Web.Services;

using System.Web.Services.Protocols;

using System.Xml;

using System;

// Define a SOAP header by deriving from the SoapHeader base class.

public class MyHeader : SoapHeader {

    public string MyValue;

}

public class MyWebService {

    public MyHeader myHeader;

    // Receive all SOAP headers besides the MyHeader SOAP header.

    public SoapUnknownHeader[] unknownHeaders;

    [WebMethod]

    [SoapHeader("myHeader", Direction=SoapHeaderDirection.InOut)]

    //Receive any SOAP headers other than MyHeader.

    [SoapHeader("unknownHeaders",Required=false)]

    public string MyWebMethod() {

       foreach (SoapUnknownHeader header in unknownHeaders) {

           // Perform some processing on the header.

       if (header.Element.Name == "MyKnownHeader")

               header.DidUnderstand = true;

       else

                // For those headers that cannot be  

                // processed, set the DidUnderstand property to false.

                header.DidUnderstand = false;

       }

       return "Hello";

    }

}

 

 



Issuevision中web service的身份验证。

1.自定义SoapHeader CredentialSoapHeader包含用户名和密码属性

2.在web service中添加CredentialSoapHeader类型的成员。

        private CredentialSoapHeader m_credentials;
        //自定义SOAP头部,用来传递认证信息
        public CredentialSoapHeader Credentials
        {
            get
            {
                return m_credentials;
            }
            set
            {
                m_credentials = value;
            }
        }

3.为web service中的方法设置自定义soap头

        [SoapHeader("Credentials")]
        [WebMethod(Description="根据SOAP标头信息,验证用户")]
        public void Authenticate()
        {
            SecurityHelper.VerifyCredentials(this);
        }

   每次调用web service中的方法时,都会首先调用SecurityHelper.VerifyCredentials(this)方法验证soap头中传递的用户信息。

4.SecurityHelper.VerifyCredentials(this)中,会获取web sercice中的属性Credentials,从而得到用户名和密码,对密码进行加密后与数据库中的用户名密码比较。

如用户、密码验证不通过,则抛出SoapException,终止web sercice中方法的执行。

  public static void VerifyCredentials(IssueVision2Services service)
        {
            if (service.Credentials == null || service.Credentials.Username == null || service.Credentials.Password == null)
            {
                EventLogHelper.LogFailureAudit("缺少认证信息的登陆尝试.");
                throw new SoapException(string.Empty, SoapException.ClientFaultCode, "Security");
              
            }
            string password = Authenticate(service.Credentials);
        }

 private static string Authenticate(CredentialSoapHeader header)
        {
         .........
        }
发表评论