iservice封装有哪些方法_总结WebService的一些封装技巧

今天早上起来,想谈谈.NET中的WebService,当然我不想讲什么是WebService,或者怎么用WebService,因为那个大家随便Google一下前100页都能找到答案。今天我想来分享一下我在用WebService中的一些技巧(至少我认为是技巧,还有点成就感),希望能给大家以后在用WebService时一点帮助和启发吧。

一、问题诞生 -- 大部分解决方案的背后总是一些头痛的问题

很早以前就用过传说中的WebService,但一直是用常规的思路在用:创建WebService项目-->写Web服务方法--> 在项目中添加Web引用-->调用Web方法。这样貌似很好,非常符合规范,在一段时间内效果也还可以,但渐渐的随着项目的扩大和同时参与项目的人员增多,就越来越觉得这种常规的方法很是不爽,为什么呢?我每次修改WebService端(添加、删除Web方法,以及修改方法名称),在引用端我都要更新WebService引用,其实是就是更新WSDL文件,很是烦人。

二、化分为合 -- 传说分久必合,合久必分

好吧,既然增加、删除、修改web方法名都会引起WSDL的更新,那么我们索性用一个统一的方法来作为webservice的访问入口吧,然后内部用switch case来区分调用哪个方法,先贴代码吧,再来简单讲讲:

统一访问接口IRemoteCall:

publicinterfaceIRemoteCall{

byte[] GeneralCall(stringmethodName,paramsbyte[] param);}

然后定义一个WebService并实现以上接口(以前还没真在webservice上实现过接口,哈哈):

[WebService(Namespace =)]

[WebServiceBinding(ConformsTo =WsiProfiles.BasicProfile1_1)]

[ToolboxItem(false)]publicclassBlogService :

System.Web.Services.WebService, IRemoteCall{

[WebMethod(EnableSession =true)]

publicbyte[] GeneralCall(stringmethodName,paramsbyte[] param)

{

switch(methodName)

{

case"LoadBlog":

{

longblogId = Serializer.DeserializeToObject(param);

BLLBlogArtical ba =newAppBlog().LoadBlog(blogId);

returnSerializer.SerializeToBinary(ba);

}

case"DeleteBlog":

{

//To Do Your Code

returnnull;

}

}     }}

这里为什么要定义接口IRemoteCall呢,主要是为接下来统一调用webservice服务的,所有实现这个接口的webservice类都可以通过GeneralCall来完成调用,待会将webservice访问器的时候会具体讲到,这里主要讲讲这个switch case。

这里我们定义了一个统一的访问入口

byte[] GeneralCall(stringmethodName,paramsbyte[] param)

意思是:传入要调用的方法名称以及序列化后的参数,返回序列化后的结果。这里为了统一数据,我们均对参数和返回值都序列化成byte数组,即用Serializer.SerializeToBinary(object)来实现,这样所有调用就都统一了格式。

有人可能会提出质疑,这样方法名称都已字符串形式是不是会显得难看,而且字符串容易出错,还没有智能提示?那也好解决,我们可以把方法名称定义成const常量就可以了。这里我对webservice的一个态度是:webservice层就是完成转接和调度工作的,它仅仅起到承接的作用,用了他可以将服务任意分布,所以里面是没有任何逻辑的(逻辑都是被封装在其他dll中的),最多是一些数据转换,所以我采用了这种模糊接口的方式。

三、自定义webservice访问器

上面我们完成了webservice端的工作,接下来就来实现客户端对webservice的灵活调用,这里上面定义的那个IRemoteCall就起到作用了,首先我们定义一个webservice访问器类RemoteCaller,代码如下:

usingSystem;using

System.Collections.Generic;using

System.Text;using

System.Collections;usingSystem.Web.Services.Protocols;

usingSharedLib_403;

namespaceITIvy.Shared.RemoteCaller{

/// 

/// 远程接口访问器

/// 

publicclassRemoteCaller

{

privatestring_MethodName;

privatebyte[] _ParamByte;

privateIRemoteCall _Caller;

privateArrayList _Params;

/// 

/// 参数列表

/// 

publicArrayList Params

{

get{return_Params; }

set{ _Params = value; }

}

/// 

/// 序列化后的参数

/// 

publicbyte[] ParamByte

{

get{return_ParamByte; }

set{ _ParamByte = value; }

}/// 

/// 远程服务方法名称

/// 

publicstringMethodName

{

get{return_MethodName; }

set{ _MethodName = value; }

}/// 

/// 远程服务调用接口

/// 

publicIRemoteCall Caller

{

get{return_Caller; }

set{ _Caller = value; }

}

/// 

/// 构造

/// 

/// Webservice远程接口

publicRemoteCaller(IRemoteCall caller)        {

_Caller = caller;

_Params =newArrayList();

}

/// 

/// 调用远程接口        /// 

/// 方法名称

/// 参数对象

/// 

publicbyte[] Call(stringmethodName,objectparam)

{

try{

_MethodName = methodName;

_ParamByte = Serializer.SerializeToBinary(param);

return_Caller.GeneralCall(_MethodName, _ParamByte);

}

catch(Exception ex)

{

if(exisSoapException)

thrownewException(((SoapException)ex).Detail["Message"].InnerText);

else

throwex;

}        }

/// 

/// 调用远程接口

/// 

/// 方法名称

/// 参数列表

/// 

publicbyte[] Call(stringmethodName, ArrayList param)

{

try

{

_MethodName = methodName;

_Params = param;

_ParamByte = Serializer.SerializeToBinary(_Params);

return_Caller.GeneralCall(_MethodName, _ParamByte);

}

catch(Exception ex)

{

if(exisSoapException)

thrownewException(((SoapException)ex).Detail["Message"].InnerText);

else

throwex;            }

}

/// 

/// 调用远程接口

/// 

/// 方法名称

/// 参数对象数组

/// 

publicbyte[] Call(stringmethodName,paramsobject[] param)

{

try

{

foreach(objectobjinparam)

_Params.Add(obj);

_MethodName = methodName;

_ParamByte = Serializer.SerializeToBinary(_Params);

return_Caller.GeneralCall(_MethodName, _ParamByte);

}

catch(Exception ex)

{

if(exisSoapException)

thrownewException(((SoapException)ex).Detail["Message"].InnerText);

else

throwex;            }

}

/// 

/// 调用远程接口

/// 

/// 

publicbyte[] Call()

{try

{

if(string.IsNullOrEmpty(_MethodName))

thrownewException("远程方法不能为空!");

return_Caller.GeneralCall(_MethodName, _ParamByte);            }

catch(Exception ex)

{

if(exisSoapException)

thrownewException(((SoapException)ex).Detail["Message"].InnerText);

else

throwex;

}        }

/// 

/// 调用远程接口        /// 

/// 返回值类型

/// 

public T Call()

{byte[] resultByte = Call();

returnSerializer.DeserializeToObject(resultByte);        }

/// 

/// 调用远程接口

/// 

/// 返回值类型

/// 方法名称

/// 参数列表

/// 

publicT Call(stringmethodName, ArrayList param)

{

byte[] resultByte = Call(methodName, param);

returnSerializer.DeserializeToObject(resultByte);

}

publicT Call(stringmethodName,objectparam)        {

try{

_MethodName = methodName;

_ParamByte = Serializer.SerializeToBinary(param);

byte[] resultByte = _Caller.GeneralCall(_MethodName, _ParamByte);

returnSerializer.DeserializeToObject(resultByte);

}catch(Exception ex)

{

if(exisSoapException)

thrownewException(((SoapException)ex).Detail["Message"].InnerText);

else

throwex;

}        }

/// 

/// 调用远程接口

/// 

/// 返回值类型

/// 方法名称

/// 参数对象数组

/// 

publicT Call(stringmethodName,paramsobject[] param)

{

byte[] resultByte = Call(methodName, param);

returnSerializer.DeserializeToObject(resultByte);

}    }}

这个访问器主要是定义了一系列访问接口的重载,利用了c#的泛型更加使接口简单了。哈哈,这个类就能让我们实现一句话调用webservice,相当简洁。注意里面的IRemoteCall属性,就是只要传入实现了该接口的类,就都可以通过该访问器来访问webservice。如何使用该类呢,下面给一个例子吧:

IRemoteCall Caller = new BlogService.BlogService();BLLBlogArtical bllArtical = new RemoteCaller(Caller).Call("LoadBlog", id);

抱歉,说错了,要两句话来调用,但是这里少去了很多数据转换的工作,因为有了泛型,呵呵,而且我可以在RemoteCaller这个访问器类中做很多工作,比如异常处理,权限验证等等。

四、总结 -- 写了这么多不总结可不行

这个实现方法的核心在于用IRemoteCall接口来规范webservice类的实现方式均为统一GenerateCall,然后 webservice类中通过switch case来将所有方法整合在一起,避免频繁更新WSDL的麻烦,***客户端利用IRemoteCall定义一个webservice访问器类 RemoteCaller来提供统一的webservice访问。

原文链接:http://www.cnblogs.com/sxwgf/archive/2011/07/10/something-about-webservice.html

【编辑推荐】

【责任编辑:彭凡 TEL:(010)68476606】

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一种全数字实时仿真的安全关键领域解决方案

随着科技的发展,系统工程的设计体量逐渐庞大起来,尤其是对于轨道交通、航空航天、核电站等安全关键领域中,如何在复杂度逐年变大的同时保证其安全性和可靠性,是近年来各大公司需要研究的课题。最近比较火热的基于模型的系统工程&a…

vue 引用网络css_vue如何引用其他组件(css和js)

1.vuejs组件之间的调用components注意:报错Do not use built-in or reserved HTML elements as component id:修改组件的名字,例如不能使用address为组件名字组件名字不要使用内置的或保留HTML元素为组件id,App.vue是一个入口,vue…

国产自主可控的MBSE建模与仿真平台SkyEye

转载: 2020年6月,哈工大、哈工程被美国商务部列入实体清单,禁用MATLAB事件频繁登上热搜,工业软件被称为「卡脖子」技术。 截止到2020年12月,中国已有超过300家企业和机构被列入美国“实体名单”,被列入名…

access求斐波拉契数列_打印目录,斐波那契数列的递归与循环,牧场牛数

实验报告1任务概述(任务说明)1 f(n)f(n-1)f(n-2)f(0)f(1)1,求斐波那契数列第20项,分别用循环和递归的方式,比较时间效率。提示:可以使用c函数clock取出当前系统时间,计算前后各一次,两次相减除以每秒的时钟…

国产自主可控的形式化验证代码自动生成工具ModelCoder可替代Matlab/Sumlink

在安全关键领域,基于模型的软件工程或者软件开发已逐渐进入了我国的装备研制过程中。使用SimuLink或者SCADE等嵌入式软件建模工具对算法或者控制逻辑进行可视化建模,然后生成高可靠的二进制代码逐渐成为了安全关键领域的主流软件开发方式。由我司自主开发…

自主可控的安全关键领域国产工业软件SkyEye

全球制造业正处于新一轮变革的浪潮中,大数据、云计算等新一代信息技术正加速向工业领域融合渗透,工业互联网、工业4.0、智能制造等战略理念不断涌现。传统产业数字化转型升级的需求强烈,工业软件缺乏自主可控成为横亘在我国发展工业4.0道路上…

weblogic中ssrf漏洞修复_Weblogic-SSRF漏洞复现

0x00简介WebLogic是美国Oracle公司出品的一个application server确切的说是一个基于JAVAEE架构的中间件,BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。SSRF简介服务端请求伪造(Server-Side Request Forgery)…

python 字符串unicode编码_python的string与Unicode转换,gbk字符串编码

问题一字串前面少了u。当遇见以下情况。返回字符串为\u82f9\u679c的unicode时候。str1 \u82f9\u679c # 这里没有u,当传入参数不是unicode的时候print str1 # 结果是 : \u82f9\u679cprint u\u82f9\u679c # 结果是 : 苹果解决方法:加上ustr1 \u82f9\u679…

应用在核电站DCS系统的代码自动生成工具ModelCoder

对标航空航天领域,核电新型号作为典型复杂系统在未来的发展趋势和任务变得十分明确,即正规化、标准化地应用MBSE从概念设计、初步设计、持续贯穿至详细设计、施工、调试、运维、退役的全生命周期各阶段,开发出符合核工业本身的需求&#xff0…

怎样在电脑上上传图片_电脑上回收站怎样恢复

把桌面上的文件删除,如果想再次找回,只要在电脑的回收站就可以原封不动的把文件找回来。但不小心删除了回收站的信息,怎么办呢?大家遇以这样的情况,也不要太着急,电脑上回收站怎样恢复呢?小编带分享一下解…

基于模型的系统工程设计软件ModelCoder在航空发动机控制设计中的应用

基于模型的系统工程(MBSE)使用数字模型的方式表达描述工程系统的完整生命周期中的需求和设计等活动,以无歧义、模块化等优点快速覆盖了如航空航天、船舶、卫星等相关安全关键领域。在系统工程的初期,系统产生的信息都以文档得形式…

python的字符编码叙述_Python: 熟悉又陌生的字符编码

字符编码是计算机编程中不可回避的问题,不管你用 Python2 还是 Python3,亦或是 C, Java 等,我都觉得非常有必要厘清计算机中的字符编码概念。本文主要分以下几个部分介绍:基本概念常见字符编码简介Python 的默认编码Python2 中的字…

基于模型的系统工程MBSE软件工具(ModelCoder)

我们一直致力于提供给航空航天制造商一套全数字的MBSE建模与仿真优化解决方案——基于模型的系统工程MBSE软件工具(ModelCoder)。我们的仿真验证技术可用于开发高复杂度和高保真度的模型,对飞机发动机,飞机的飞控进行预测性的虚拟…

面向航空航天工业领域的基于模型的仿真验证工具SkyEye

我们一直致力于提供给航空航天制造商一套全数字的优化方案——面向航空航天工业领域的基于模型的仿真验证工具SkyEye。我们的仿真验证技术可用于开发高复杂度和高保真度的模型,对发动机,飞机的飞控进行预测性的虚拟验证和测试。我们能够准确地进行全数字…

高性能高可靠性的全数字嵌入式仿真测试软件SkyEye

随着科技的发展,系统工程的设计体量逐渐庞大起来,尤其是对于轨道交通、航空航天、核电站等安全关键领域中,如何在复杂度逐年变大的同时保证其安全性和可靠性,是近年来各大公司需要研究的课题。最近比较火热的基于模型的系统工程&a…

二元一次函数最值问题_初二上学期,一次函数方案设计最值问题,两类题目解题思路不一样...

方案设计问题在一元一次方程实际问题中有所接触,在一次函数实际应用题中也有。一次函数中的方案设计问题,常与一次函数的性质、不等式(组)、方程组等知识点相结合,这类题目一旦掌握解题方法,难度不是很大。本篇文章主要介绍一次函…

rabiitmq卸载_RabbitMQ安装方式及常用命令

在ubuntu系统中安装rabbitmq# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server_3.6.6-1_all.deb# dpkg -i rabbitmq-server_3.6.6-1_all.deb如果提示依赖其他的包,执行如下命令安装依赖包# apt-get -f install然后# dpkg -i rabbitm…

高性能全数字嵌入式仿真测试软件SkyEye支持多达70余种核心

全数字仿真平台作为工业领域不可缺少的重要软件之一,除了可以与MATLAB或者Simulink集成外,还支持哪些优秀的功能?在了解新一代全数字仿真平台SkyEye之前,先来学习一下什么是全数字仿真平台。 什么是全数字仿真平台 全数字仿真平…

dalsa线扫相机调试文档_线阵相机调试文档

1.相机型号参数相机:线16k CL分辨率:16384 x 1像素大小:3.52 μm x 3.52 μm麦克斯行费率:48 千赫镜头安装(螺纹):M72 x 1产品编号:LA-CM-16K05A-xx-R注:现场采用的相机型号即为上表1.1型号参数…

SystemC 代码添加和测试方法

1.启动流程 在 code/utils/ 下添加 new_systemc 相关代码,启动流程如下: 2.调用关系 3.地址映射 假设有两个 systemc 设备:device1 和 device2,device1 的内存地址映射区域为 0x20000x2fff,device2 的内存映射区域为 …