public ArrayList Params
{
get { return _Params; }
set { _Params = value; }
}
///
/// 序列化后的参数
/// public byte[] ParamByte
{
get { return _ParamByte; }
set { _ParamByte = value; }
}
///
/// 远程服务方法名称
/// public string MethodName
{
get { return _MethodName; }
set { _MethodName = value; }
}
///
/// 远程服务调用接口
/// public IRemoteCall Caller
{
get { return _Caller; }
set { _Caller = value; }
}
///
/// 构造
/// ///
Webservice远程接口
public RemoteCaller(IRemoteCall caller)
{
_Caller = caller;
_Params = new ArrayList();
}
///
/// 调用远程接口
/// ///
方法名称
///
参数对象
///
public byte[] Call(string methodName, object param)
{
try
{
_MethodName = methodName;
_ParamByte = Serializer.SerializeToBinary(param);
return _Caller.GeneralCall(_MethodName, _ParamByte);
}
catch (Exception ex)
{
if (ex is SoapException)
throw new Exception(((SoapException)ex)。Detail["Message"].InnerText);
else
throw ex;
}
}
///
/// 调用远程接口
/// ///
方法名称
///
参数列表
///
public byte[] Call(string methodName, ArrayList param)
{
try
{
_MethodName = methodName;
_Params = param;
_ParamByte = Serializer.SerializeToBinary(_Params);
return _Caller.GeneralCall(_MethodName, _ParamByte);
}
catch (Exception ex)
{
if (ex is SoapException)
throw new Exception(((SoapException)ex)。Detail["Message"].InnerText);
else
throw ex;
}
}
///
/// 调用远程接口
/// ///
方法名称
///
参数对象数组
///
public byte[] Call(string methodName, params object[] param)
{
try
{
foreach (object obj in param)
_Params.Add(obj);
_MethodName = methodName;
_ParamByte = Serializer.SerializeToBinary(_Params);
return _Caller.GeneralCall(_MethodName, _ParamByte);
}
catch (Exception ex)
{
if (ex is SoapException)
throw new Exception(((SoapException)ex)。Detail["Message"].InnerText);
else
throw ex;
}
}
健康知识平台
///
/// 调用远程接口
/// ///
public byte[] Call()
{
try
{
if (string.IsNullOrEmpty(_MethodName))
throw new Exception("远程方法不能为空!");
return _Caller.GeneralCall(_MethodName, _ParamByte);
}
catch (Exception ex)
{
if (ex is SoapException)
throw new Exception(((SoapException)ex)。Detail["Message"].InnerText);
else
throw ex;
}
}
///
/// 调用远程接口
/// ///
返回值类型 ///
public T Call
()
{
byte[] resultByte = Call();
return Serializer.DeserializeToObject(resultByte);
}
///
/// 调用远程接口
///
/// 返回值类型
/// 方法名称
/// 参数列表
///
public T Call(string methodName, ArrayList param)
{
byte[] resultByte = Call(methodName, param);
return Serializer.DeserializeToObject(resultByte);
}
public T Call(string methodName, object param)
{
try
{
_MethodName = methodName;
_ParamByte = Serializer.SerializeToBinary(param);
byte[] resultByte = _Caller.GeneralCall(_MethodName, _ParamByte);
return Serializer.DeserializeToObject(resultByte);
}
catch (Exception ex)
{
if (ex is SoapException)
throw new Exception(((SoapException)ex)。Detail["Message"].InnerText);
else
throw ex;
}
}
///
/// 调用远程接口
///
/// 返回值类型
/// 方法名称
/// 参数对象数组
///
public T Call(string methodName, params object[] param)
{
byte[] resultByte = Call(methodName, param);
return Serializer.DeserializeToObject(resultByte);
}
}}
这个访问器主要是定义了一系列访问接口的重载,利用了c#的泛型更加使接口简单了。哈哈,这个类就能让我们实现一句话调用webservice,相当简洁。注意里面的IRemoteCall属性,就是只要传入实现了该接口的类,就都可以通过该访问器来访问webservice。如何使用该类呢,下面给一个例子吧:
IRemoteCall Caller = new BlogService.BlogService();BLLBlogArtical bllArtical = new RemoteCaller(Caller)。Call("LoadBlog", id);
抱歉,说错了,要两句话来调用,但是这里少去了很多数据转换的工作,因为有了泛型,呵呵,而且我可以在RemoteCaller这个访问器类中做很多工作,比如异常处理,权限验证等等。
四、总结 -- 写了这么多不总结可不行。更多http://jaiaiifh.blog.51cto.com
这个实现方法的核心在于用IRemoteCall接口来规范webservice类的实现方式均为统一GenerateCall,然后 webservice类中通过switch case来将所有方法整合在一起,避免频繁更新WSDL的麻烦,最后客户端利用IRemoteCall定义一个webservice访问器类 RemoteCaller来提供统一的webservice访问。