Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25060
  • 博文数量: 11
  • 博客积分: 445
  • 博客等级: 下士
  • 技术积分: 240
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-14 14:27
文章分类
文章存档

2012年(11)

我的朋友
最近访客

分类: 嵌入式

2012-07-21 08:48:36

 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访问。
阅读(236) | 评论(0) | 转发(0) |
0

上一篇:如何使用缓存来提高网站的性能知识解析

下一篇:没有了

给主人留下些什么吧!~~