一般在项目中,制作的都是基于SOAP协议的webservices,其描述语言是WSDL。但是有时候在项目中,需要保证webservices的安全,需要对其进行进行验证,那么我们就要实现SoapHeader,具体的实现方式如下:
首先就是自定义一个类,继承自System.Web.Services.Protocols.SoapHeader ,然后在这个类中,通过暴露的公共属性和方法来进行校验。
其次就是在webservices主体方法中,添加对SoapHeader的验证的支持
最后直接在用户页面进行验证,调用方法即可。
首先,定义一个sSoapHeader类,暴露出其提供的公共验证字段,并提供验证方法:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Web;
namespace
webServiceDemo
{
public
class
sSoapHeader:System.Web.Services.Protocols.SoapHeader
{
private
string
_UserId
=
string
.Empty;
private
string
_UserPwd
=
string
.Empty;
public
sSoapHeader() { }
public
string
UserId
{
get
{
return
_UserId;
}
set
{
_UserId
=
value;
}
}
public
string
UserPwd
{
get
{
return
_UserPwd;
}
set
{
_UserPwd
=
value;
}
}
public
void
Initial(
string
username,
string
password)
{
UserId
=
username;
UserPwd
=
password;
}
public
bool
IsValid(
string
uid,
string
pwd,
out
string
msg)
{
msg
=
""
;
if
(uid
==
"
admin
"
&&
pwd
==
"
admin888
"
)
{
return
true
;
}
else
{
msg
=
"
对不起,你无法调用
"
;
return
false
;
}
}
public
bool
IsValid(
out
string
msg)
{
return
IsValid(_UserId, _UserPwd,
out
msg);
}
}
}
其次就是在webservice主体中,添加对此验证方法的支持
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Web;
using
System.Web.Services;
using
System.Web.Services.Protocols;
namespace
webServiceDemo
{
///
<summary>
///
Service1 的摘要说明
///
</summary>
[WebService(Namespace
=
"
http://tempuri.org/
"
)]
[WebServiceBinding(ConformsTo
=
WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(
false
)]
//
若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
//
[System.Web.Script.Services.ScriptService]
public
class
Service1 : System.Web.Services.WebService
{
public
sSoapHeader s
=
new
sSoapHeader();
[SoapHeader(
"
s
"
)]
//
这里就是添加验证方法的标志
[WebMethod]
public
string
HelloWorld(
int
a,
int
b)
{
string
msg
=
""
;
if
(
!
s.IsValid(
out
msg))
{
return
msg;
}
return
(a
+
b).ToString();
}
}
}
在上图中,我已经标志的很清楚了[SoapHeader("s")] 就是添加验证方法的标志。
最后就是在用户页面中进行调用,引用完毕后,需要对soapheader暴露的公共属性方法进行赋值判断,最后调用即可。只要验证正确,便可以正常调用,否则则提示没有权限:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Web;
using
System.Web.UI;
using
System.Web.UI.WebControls;
namespace
WEB
{
public
partial
class
_Default : System.Web.UI.Page
{
protected
void
Page_Load(
object
sender, EventArgs e)
{
localhost.Service1 s
=
new
WEB.localhost.Service1();
localhost.sSoapHeader header
=
new
WEB.localhost.sSoapHeader();
header.UserId
=
"
admin
"
;
header.UserPwd
=
"
admin888
"
;
s.sSoapHeaderValue
=
header;
Response.Write(s.HelloWorld(
2
,
1
));
}
}
}