1,自定义SoapHeader类 ,必须继承SoapHeader类,下面引用老徐的一段代码:
System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Services;
using System.Web.Services.Protocols;//SoapHeader处于此命名空间
/// <summary>
/// Coded By Frank Xu Lei 2/17/2009 http://www.cnblogs.com/frank_xl/
/// MySoapHeader 定义用来传递来自用户的 Soap消息的Soap Header信息
/// </summary>
public class MySoapHeader : SoapHeader//用户自定义SoapHeader类必须继承于SoapHeader
{
//属性,存储用户票据
private string _token;
//构造函数
public MySoapHeader()
{
//
// TODO: Add constructor logic here
//
}
//重载构造函数
public MySoapHeader(string sToken)
{
this._token = sToken;
}
//属性访问器
public string Token
{
get { return this._token; }
set { this._token = value; }
}
}
2,通过自定义类对webService进行处理:
[SoapHeader("_authenticationToken")] 设轩webService 的SoapHeader 属性
通过_authenticationToken != null && UserValidation.IsUserLegal(_authenticationToken.Token )中的_authenticationToken来得到客户端的值
全部代码:
System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using WebServiceUserValidation;//这里只是难证类,下面的IsUserLegal只是做了两个字符串的是否相等
[WebService(Namespace = "http://www.cnblogs.com/frank_xl/")]//定义WebService的命名空间,为避免重复,通常设置为URL地址
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class FrankXuWebService : System.Web.Services.WebService
{
public MySoapHeader _authenticationToken;//存储包含用户票据Soap Header信息的属性字段,MySoapHeader继承自SoapHeader,我们在服务端定义实现
public FrankXuWebService()
{
}
//定义SoapHeader传递的方向,
//SoapHeaderDirection.In;只发送SoapHeader到服务端
//SoapHeaderDirection.Out;只发送SoapHeader到客户端
//SoapHeaderDirection.InOut;发送SoapHeader到服务端和客户端
//SoapHeaderDirection.Fault;服务端方法异常的话,会发送异常信息到客户端
[SoapHeader("_authenticationToken")] //设置方法SoapHeader属性,用于WebService的方法处理Soap Header消息
//"_authenticationToken"就是定义的FrankXuWebService类的私有属性名称,
[WebMethod(EnableSession=false)]
public string HelloFrank()
{
//要想在浏览器直接使用Invoke测试服务,这个用户票据代码要注销,不然会无法调用
if (_authenticationToken != null && UserValidation.IsUserLegal(_authenticationToken.Token ))//验证票据的值是否正确,
{
return "Hello Frank,WebMethod is called sucessfully...";
}
else
{
throw new Exception("Authentication Failed");
}
}
}
3,客户端,用VS2008引用webservice ref 把webService引用进来(下实例代码中把这个proxy命名为localhost)
System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleWebServiceClient
{
class Program
{
static void Main(string[] args)
{
localhost.MySoapHeader mySoapHeader = new ConsoleWebServiceClient.localhost.MySoapHeader();//实例化一个简单对象访问协议的头,SoapHeader
mySoapHeader.Token = "FrankXuLei";//对象设置客户端知道的票据的值
string sResult = string.Empty;
localhost.FrankXuWebService frankXuWebService = null;
try
{
frankXuWebService = new ConsoleWebServiceClient.localhost.FrankXuWebService();//实例化一个客户端引用Web服务的类
frankXuWebService.MySoapHeaderValue = mySoapHeader;//**********************设置Web服务的SoapHeader
sResult = frankXuWebService.HelloFrank();//调用Web服务的HelloWorld()方法。
Console.WriteLine(sResult);
}
catch (Exception ex)
{
//
Console.WriteLine("Call WebService is failed...");
throw ex;
}
finally
{
//释放托管资源
if (frankXuWebService != null)
frankXuWebService.Dispose();
}
//调试
Console.WriteLine("Press any key to continue...");
Console.ReadLine();
}
}
}
至此做完了!