最近的项目采用了基于WEBSERVICE的三层架构,仔细想想,这种方式还是扩展性蛮好的。本来担心WEBSERVICE的瓶颈问题,现在发现,担心是多余的,微软的东西还不会那么差劲。下面来一个总结:
使用WEBSERVICE的优点:
1.系统扩展性增强
2.便于集中统一控制
3.屏蔽数据层(安全性)
webservice功能总结:
1.用户的身份认证
WEBSERVICE是采用SOAP通讯协议,使用WSDL定义语言,以XML为传输数据格式,SOAP信息包括SOAPHEADER 和 SOAPBODY两个部分。
在项目中,我们也用到了soapheader:
public class SecurityHeader : System.Web.Services.Protocols.soapHeader
{
private SecurityInfo _securityinfo;
//验证信息
public SecurityInfo SecurityInfo
{
get
{
return _securityinfo;
}
}
public ClientUserInfo Check()
{
try
{
if (_securityinfo == null)
{
errinfo = "无效的验证信息,错误代码 1001";
return null;
}
//检测缓存中是否存在,并且合法
ClientUserInfo lc_UserInfo = ClientUserInfo.GetClientUserInfo(_securityinfo);
if (lc_UserInfo != null)
{
if (_securityinfo.Seq >= lc_UserInfo.Seq)
{
lc_UserInfo.Seq = _securityinfo.Seq;
return lc_UserInfo;
}
else
{
//直接打回
errinfo = "无效的验证信息,错误代码 1002";
return null;
}
}
//到期,或者是新登录
ServerDataAccess lc_da = new ServerDataAccess();
try
{
if (string.IsNullOrEmpty(_securityinfo.UserCode))
{
errinfo = "没有找到登录信息";
return null;
}
//检测用户名密码
string lc_sql = "Select fPassword From T_User Where fUserCode=@UserCode";
DbParameter[] lc_Pam = new DbParameter[1];
lc_Pam[0] = ServerDataAccess.CreateParameter("@UserCode",_securityinfo.UserCode);
string lc_DbPassstr = Convert.ToString(lc_da.GetScalar(lc_sql,lc_Pam));
if (string.IsNullOrEmpty(lc_DbPassstr))
{
errinfo = "没有找到该用户";
return null;
}
byte[] lc_DBPass = Convert.FromBase64String(lc_DbPassstr);
if (!ServerFun.CompDBPass(lc_DBPass,_securityinfo.UserPass,_securityinfo.UserCode))
{
errinfo = "用户名密码错误";
return null;
}
lc_UserInfo = ClientUserInfo.Create(_securityinfo);
if (lc_UserInfo == null)
{
errinfo = "用户验证失败";
return null;
}
return lc_UserInfo;
}
finally
{
lc_da.Close();
}
}
catch (Exception exp)
{
errinfo = "验证失败,错误原因:" + exp.Message;
return null;
}
}
}
SecurityHeader类作为webservice类的一个属性公开
2.数据访问接口
在项目中,由于所有的数据都通过WEBSERVICE取得,那么在WEBSERVICE里会定义很多相关的WEBMthod。
[WebMethod,SoapHeader("header")]
public int QueryToDataSet(int pm_Type,string pm_sql,byte[] pm_Params,bool pm_NeedCompress,
out DataSet pm_DataSet,out string pm_ErrorInfo)
{
pm_DataSet = null;
pm_ErrorInfo = string.Empty;
ClientUserInfo lc_Info;
if (!ClientUserInfo.CheckHeader(header,out lc_Info,out pm_ErrorInfo)) return -100;
try { DbParameter[] lc_Params = ServerDataAccess.BufferToDbParameters(pm_Params); pm_DataSet = ServerDataAccess.DoQuery(pm_Type,pm_sql,lc_Params); pm_ErrorInfo = string.Empty; return 0; } catch (Exception exp) { pm_DataSet = null; pm_ErrorInfo = exp.Message; return -1; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。