如何java中调用webservicee中自定义的类

flex调用webservice中的自定义类的方法
字体:[ ] 类型:转载 时间:
flex如何调用webservice中的自定义类,下面有个不错的示例,不了解的朋友可以参考下
代码如下: public class ReturnResult { public int curIndex { } public DataTable idxList { } } //测试数据库连接 [WebMethod(Description = "!!!测试数据库连接,链接字符串在web.config中")] public bool conectDB() { strCon = ConfigurationSettings.AppSettings["sqlConDuke"]; conn = new SqlConnection(strCon); try { conn.Open();
} catch (Exception) {
} finally { conn.Close(); } }
代码如下: [WebMethod(Description = "根据 &b&照片名&/b& 获得详细数据(DataTable),strTb,eg:PanVstrImgName,eg:40-0000150")] public DataTable getInfoByImgName(string strTb, string strImgName) { bool ifCon = conectDB(); if (ifCon) { string sql_BfCar = "SELECT * FROM dbo." + strTb + " where ImageName LIKE '%" + strImgName + "%'"; da = new SqlDataAdapter(sql_BfCar, conn); myds = new DataSet(); da.Fill(myds); return myds.Tables[0]; } else {
} } [WebMethod(Description = "根据 &b&照片名&/b& 获得所在Link的所有数据(ReturnResult),strTb,eg:PanVstrImgName,eg:40-0000150")] public ReturnResult getLinkDTByImgName(string strTb, string strImgName) { ReturnResult returnResult = new ReturnResult(); bool ifCon = conectDB(); if (ifCon) { returnResult.curIndex = Convert.ToInt32(getInfoByImgName(strTb, strImgName).Rows[0][0]); string strLinkGuid = getInfoByImgName(strTb, strImgName).Rows[0][1].ToString(); string sql_BfCar = "SELECT * FROM dbo." + strTb + " where LinkGuid LIKE '%" + strLinkGuid + "%'"; da = new SqlDataAdapter(sql_BfCar, conn); myds = new DataSet(); da.Fill(myds); returnResult.idxList = myds.Tables[0]; return returnR } else {
Flex代码:
代码如下: &?xml version="1.0" encoding="utf-8"?& &s:Application xmlns:fx="/mxml/2009" xmlns:s="library:///flex/spark" xmlns:mx="library:///flex/mx" minWidth="955" minHeight="600" creationComplete="application1_creationCompleteHandler(event)"& &fx:Script& &![CDATA[ import mx.collections.ArrayC import mx.controls.A import mx.events.FlexE import mx.rpc.events.FaultE import mx.rpc.events.ResultE public var arr:ArrayCollection=new ArrayCollection(); public var aaa:String=new String(); protected function webservice1_faultHandler(event:FaultEvent):void { Alert.show(event.fault.toString()); } protected function getLinkDTByImgNameHandler(event:ResultEvent):void { // aaa=this.myweb.getLinkDTByImgName.lastResult.curI // arr=this.myweb.getLinkDTByImgName.lastResult.idxList.Tables.Table.R aaa=event.result.curI arr=event.result.idxList.Tables.Table.R Alert.show(aaa+" "+arr.length.toString()); } protected function application1_creationCompleteHandler(event:FlexEvent):void { myweb.getLinkDTByImgName("PanView","40-0000150"); } ]]& &/fx:Script& &fx:Declarations& &!-- 将非可视元素(例如服务、值对象)放在此处 --& &s:WebService id="myweb" wsdl="http://10.19.1.55/serverPano/WebServiceDuke.asmx?WSDL" fault="webservice1_faultHandler(event)"& &s:operation name="getLinkDTByImgName" result="getLinkDTByImgNameHandler(event)"&&/s:operation& &/s:WebService& &/fx:Declarations& &/s:Application&
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具2086人阅读
.Net(69)
所谓自定义类,不知道我有没有表达清楚,这里指的就是petshop中的Model层实体类了。
比如以下代码:&
using System.C
using System.Collections.G
using System.T namespace Model
&&& [Serializable]
&&& public class Student
&&&&&&& private string stuN
&&&&&&& public Student()
&&&&&&& { }&
&&&&&&& public string StuName
&&&&&&& {&&&&&&&&&&&&
&&&&&&&&&&&&&&&&get
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&return this.stuN
&&&&&&&&&&&&&&&&}&&&&&&&&&&&&
&&&&&&&&&&&&&&&&set
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&this.stuName =
&&&&&&&&&&&&&&&&}&
&&&&&&&& webservice传递的内容必须是可序列化的,不管是参数还是返回值。上面定义的实体类Student,在类定义之前标示了[Serializable],指明可序列化的。但当涉及到实体类集合的时候,如果使用IList&Student&来表示,就会抱错,原因是IList是不可以序列化的,这种情况下,我们就可以使用System.Collections.ObjectModel.Collection&Student&来表示一个实体类集合。这里给出了两种可能出现的实体类和实体类集合,以下就开始说明各种解决方法:&
&&&&&&1、把实体类集合,作为Object[]传递。
&&&&& 这种情况下,我们必须使用webservice中的实体类,传递的是实体类集合对应的Object[]传递,WebService中方法的参数类型是ArrayList。
比如WebService中的方法是: [XmlInclude(typeof(Student))]
&&&&&&& [WebMethod]
&&&&&&& public string HelloStus(ArrayList stuList)&
&&&&&&& {&&
&&&&&&&&&&& BLL.Class1 cls = new BLL.Class1();
&&&&&&&&&&& return cls.GetName(stuList);
&&&&&&& }&&&&&&&& 别漏了[XmlInclude(typeof(Student))]这一行,不然在表现层就引用不到WebService中的实体类了。
这个时候,在表现层添加web引用,表现层中的调用代码如下:(参考Demo中的button1_Click()方法)&&
&&&&&&&&/// &summary&
&&&&&&& /// 必须使用webservice中的实体类,传递实体类集合,作为Object[]传递,WebService中的参数类型是ArrayList,并提供一个将集合转化为Object[]的公共类
&&&&&&& /// &/summary&
&&&&&&& /// &param name=&sender&&&/param&
&&&&&&& /// &param name=&e&&&/param&
&&&&&&& private void button1_Click(object sender, EventArgs e)
&&&&&&&&&&& string str = &&;&
&&&&&&&&&&& localhost.Student stuInfo1 = new localhost.Student();
&&&&&&&&&&& stuInfo1.StuName = &lxinxuan&;
&&&&&&&&&&& localhost.Student stuInfo2 = new localhost.Student();
&&&&&&&&&&& stuInfo2.StuName = &&;
&&&&&&&&&&& IList&localhost.Student& stuList = new List&localhost.Student&();
&&&&&&&&&&& stuList.Add(stuInfo1);
&&&&&&&&&&& stuList.Add(stuInfo2);
&&&&&&&&&&& object[] array = this.ConvertToArray&localhost.Student&(stuList);//这是一个将集合转换为Objec[]的泛型方法
&&&&&&&&&&& str = ser.HelloStus(array);//传递Object[],返回值是StuName的值&
&&&&&&&&&&& MessageBox.Show(str);
//这是一个将集合转换为Objec[]的泛型方法
&private object[] ConvertToArray&T&(IList&T& tList)
&&&&&&&&&&& object[] array = new object[tList.Count];
&&&&&&&&&&& int i = 0;
&&&&&&&&&&& foreach (T t in tList)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& array[i] =
&&&&&&&&&&&&&&& i++;
&&&&&&&&&&& }
&&&&&&&&&&&
&&&&&&&&2、传递单个实体类,使用WebService中的实体类这种情况下,可以看作是情况1的特例——只有一个元素的数组。当然,这种情况下我们可以换一种做法——使用WebService中的实体类。
&&&&先看webservice中的代码:
[XmlInclude(typeof(Student))]
&&&&&&& [WebMethod]
&&&&&&& public string HelloStu(Student stuInfo)
&&&&&&& {&
&&&&&&&&&&& return stuInfo.StuN
&&&&&&& }&&&&&&&& 同样必须添加这一行代码[XmlInclude(typeof(Student))]。
然后调用代码是:
&/**//// &summary& 网管论坛bbs_bitsCN_com&
&&&&&&& /// 传递单个实体类,使用WebService中的实体类
&&&&&&& /// &/summary&
&&&&&&& /// &param name=&sender&&&/param&
&&&&&&& /// &param name=&e&&&/param&&
&&&&&&& private void button2_Click(object sender, EventArgs e)
&&&&&&& { 中国网管论坛&
&&&&&&&&&&& string str = &&;
&&&&&&&&&&& localhost.Student stuInfo1 = new localhost.Student();//注意,这里调用了webservice中的实体类,而不是Model中的实体类。否则出错。
&&&&&&&&&&& stuInfo1.StuName = &lxinxuan&;&&
&&&&&&&&&&& str = ser.HelloStu(stuInfo1);//传递webservice中的实体类
&&&&&&&&&&& MessageBox.Show(str);
&&&&&&&& 3、传递实体类构成的Collection。这是和情况1类似的情形,只是传递的类型不一样。可以对照一下。
这种情况下,必须通过修改Reference.cs的代码,不过每次更新都要重新修改,而且必须每个类修改,比较麻烦!不推荐使用,这不知道是哪位仁兄想出来的方法,我也是看了人家的做法才总结出来的,不过能去修改Reference.cs的代码,已经说明钻研精神了,鼓励下。&
同样先给出webservice中方法的代码:
[WebMethod]
&&&&&&& public string HelloStusByList(Collection&Student& stuList)//这里参数类型是Collection 网管下载&
&&&&&&& {&&
&&&&&&&&&&& BLL.Class1 cls = new BLL.Class1();
&&&&&&&&&&& return cls.GetName(stuList);
&&&&&&& }&&&&&&&& 方法的参数是Collection,在添加了webservice之后,Reference.cs中的对应方法的参数变成了student[],数组!!webservice和数组走得真近阿。。。这里将Reference.cs中的方法HelloStusByList的参数类型student[]改为Collection&localhost.Student&,如下所示。&
表示层调用代码:
/**//// &summary&&
&&&&&&& /// 传递实体类构成的Collection,通过修改Reference.cs的代码,不过每次更新WebService之后都要重新修改,而且必须每个类修改,麻烦
&&&&&&& /// &/summary&
&&&&&&& /// &param name=&sender&&&/param&
&&&&&&& /// &param name=&e&&&/param&&
&&&&&&& private void button3_Click(object sender, EventArgs e)
&&&&&&& {&
&&&&&&&&&&& string str = &&;
&&&&&&&&&&& localhost.Student stuInfo1 = new localhost.Student();
&&&&&&&&&&& stuInfo1.StuName = &lxinxuan&;&
&&&&&&&&&&& localhost.Student stuInfo2 = new localhost.Student();
&&&&&&&&&&& stuInfo2.StuName = &&;
&&&&&&&&&&& Collection&localhost.Student& stuList = new Collection&localhost.Student&();&
&&&&&&&&&&& stuList.Add(stuInfo1);
&&&&&&&&&&& stuList.Add(stuInfo2);
&&&&&&&&&&& str = ser.HelloStusByList(stuList);//默认情况下,这里HelloStusByList方法的参数是Student[],通过手动修改为Collection,就可以了
&&&&&&&&&&& MessageBox.Show(str);&
&&&&&&&&&&&&4、先将实体类集合序列化为表现为xml格式的string,然后在webservice中反序列化成Collection&&(注意:不可以是IList&&),然后再传递给业务层对象。
[WebMethod]
&&&&&&& public string HelloStusByCollection(string sXml)
&&&&&&& {&
&&&&&&&&&&& BLL.Class1 cls = new BLL.Class1();
&&&&&&&&&&&//先反序列化为collection&
&&&&&&&&&&&&&Collection&Student& stuList = cls.DeSerializerCollection&Student&(sXml, typeof(Collection&Student&));&&&&&&&&&&&&
&&&&&&&&&&& return cls.GetName(stuList);
&&&&&&& }DeserializerCollection方法代码如下:
&&&&&&& /**//// &summary&&&&&&&&& ///&
&&&&&&& /// &/summary&
&&&&&&& /// &typeparam name=&T&&&/typeparam&
&&&&&&& /// &param name=&sXml&&&/param&&
&&&&&&& /// &param name=&type&&&/param&
&&&&&&& /// &returns&&/returns&
&&&&&&& public Collection&T& DeSerializerCollection&T&(string sXml, Type type)
&&&&&&& {&
&&&&&&&&&&& XmlReader reader = XmlReader.Create(new StringReader(sXml));
&&&&&&&&&&& System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(type);
&&&&&&&&&&&
&&&&&&&&&&& object obj = serializer.Deserialize(reader);&
&&&&&&&&&&& return (Collection&T&)
表现层调用代码如下:
/**//// &summary&&
&&&&&&& /// 先将实体类集合序列化为string,然后在webservice中反序列化成Collection&&,然后再传递给业务层对象
&&&&&&& /// &/summary&
&&&&&&& /// &param name=&sender&&&/param&
&&&&&&& /// &param name=&e&&&/param&&
&&&&&&& private void button4_Click(object sender, EventArgs e)
&&&&&&& {&&&&&&&&&&&& string str = &&;
&&&&&&&&&&& Student stuInfo1 = new Student();
&&&&&&&&&&& stuInfo1.StuName = &lxinxuan&;&
&&&&&&&&&&& Student stuInfo2 = new Student();
&&&&&&&&&&& stuInfo2.StuName = &&;
&&&&&&&&&&& Collection&Student& stuList = new Collection&Student&();&
&&&&&&&&&&& stuList.Add(stuInfo1);
&&&&&&&&&&& stuList.Add(stuInfo2);
&&&&&&&&&&& string stuString = this.Serializer&Collection&Student&&(stuList);//先序列化为xml文件格式的string&
&&&&&&&&&&& str = ser.HelloStusByCollection(stuString);
&&&&&&&&&&& MessageBox.Show(str);
&&&&&&& }Serialize方法代码如下:
/**//// &summary&&
&&&&&&& /// 实体类集合序列化为字符串
&&&&&&& /// &/summary&
&&&&&&& /// &typeparam name=&T&&&/typeparam&
&&&&&&& /// &param name=&objToXml&&&/param&&&
&&&&&&& /// &returns&&/returns&
&&&&&&& public string Serializer&T&(T objToXml)
&&&&&&& {&
&&&&&&&&&&& System.IO.StringWriter writer = new System.IO.StringWriter();
&&&&&&&&&&& System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(objToXml.GetType());
&&&&&&&&&&& serializer.Serialize(writer, objToXml);
&&&&&&&&&&& return writer.GetStringBuilder().ToString();&
&&&&&&&& 5、这种情况就是情况4的特例,序列化一个实体类并传递,方法类似,就不写出来,参见Demo代码。
大概就是这些了,当然传递DataSet是最传统最好的办法了,呵呵~&
博主测试:
上面的介绍写的很详细,按照步骤可以完成webservice传递自定义参数的目的。通过上面几种方法的启示,博主自己写想到一个方法。
在webservice方法中参数全部通过字符串来传递,然后在自定义类型中添加对象和字符串互相转换的方法,需要传递自定义对象时,将对象转换为字符串,然后接收方收到字符串后将字符串再转换为自定义对象。
这种方法和序列化方法差不多,但是简单易懂,不过可能安全性可能不好。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:285591次
积分:3149
积分:3149
排名:第10920名
原创:56篇
转载:61篇
评论:57条
(1)(1)(1)(8)(3)(1)(2)(6)(1)(18)(3)(5)(10)(3)(4)(4)(1)(1)(1)(3)(1)(1)(9)(1)(13)(2)(5)(8)四步完成WebService服务端与客户端的调用 -
- ITeye博客
博客分类:
&& 内部系统之间数据传输使用RMI方式比较方便,但外部系统之间由于系统兼容性原因,使用WebService是较流行的方式。这两天特意整理了一下WebService发布、调用的方式,把实例贴出来。
&&
&& 1.服务端配置:使用CXF + Spring方式。
&& 配置web.xml,添加cxfservler,
&&
&servlet-name&CXFServlet&/servlet-name&
&servlet-class&org.apache.cxf.transport.servlet.CXFServlet&/servlet-class&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&CXFServlet&/servlet-name&
&url-pattern&/*&/url-pattern&
&/servlet-mapping&
原因是webservice服务是运行在web容器中的,接收外部的http请求。所以配置一个servler,这里由cxf进行包装。
&&& 2.编写具体发布服务逻辑,并使用Spring进行配置
&&&
@WebService
public interface ISpeakService {
public String speak(String userName, Date date);
@WebService(endpointInterface = "com.sfexpress.ISpeakService")
public class SpeakServiceImpl implements ISpeakService {
public String speak(String userName, Date date){
return "Hello " + userName + ", today is " + date.toString();
配置spring beans.xml文件,发布服务端的逻辑,并配置外接访问地址为:/SpeakService
&&
&import resource="classpath:META-INF/cxf/cxf.xml" /&
&import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /&
&import resource="classpath:META-INF/cxf/cxf-servlet.xml" /&
&jaxws:endpoint id="speakService"
implementor="com.sfexpress.SpeakServiceImpl"
address="/SpeakService" /&
3.导出服务端生成的wsdl文件,访问http://localhost:8180/SpeakService?wsdl,把网页内容保存成speak.wsdl文件。wsdl是接口描述文件,通过XML进行定义,客户端需要把wsdl文件提前解析为java文件,这样在客户端就可以像rmi方式一样调用。
转换工具使用apache-cxf-2.6.16, 具体命令:wsdl2java -p com -d D:\data\sss d:\data\sss\speak.wsdl 取出生成的ISpeakService.java类。
4.新建java工程并创建一个客户端调用主类。
拷贝刚才生成的ISpeakService.java至客户端工程。
主类中按下面方式调用即可。
public static void main(String[] args) throws DatatypeConfigurationException {
// 创建WebService客户端代理工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// 注册WebService接口
factory.setServiceClass(ISpeakService.class);
// 设置WebService地址
factory.setAddress("http://localhost:8180/SpeakService?wsdl");
XMLGregorianCalendar
date = DatatypeFactory.newInstance().newXMLGregorianCalendar();
date.setYear(2014);
date.setMonth(11);
date.setDay(12);
ISpeakService greetingService = (ISpeakService) factory.create();
System.out.println("message context is:"
+ greetingService.speak("beck", date));
下载次数: 154
浏览 11637
beck5859509
浏览: 66365 次
来自: 深圳
好久木有更新了咧,wei 哥说你还是在这边办公额?
wangxuehui 写道文章写的不错,希望多写写哈哈,一起学 ...
文章写的不错,希望多写写
wangxuehui 写道即&p的值0x7fff654 ...
即&p的值0x7fff65485a00修改为abc h ...您所在的位置: &
总结WebService的一些封装技巧
总结WebService的一些封装技巧
讨论一下WebService的一些封装技巧,也就是会碰到的常见问题的解决,希望能给大家以后在用WebService时一点帮助和启发吧。
今天早上起来,想谈谈.NET中的WebService,当然我不想讲什么是WebService,或者怎么用WebService,因为那个大家随便Google一下前100页都能找到答案。今天我想来分享一下我在用WebService中的一些技巧(至少我认为是技巧,还有点成就感),希望能给大家以后在用WebService时一点帮助和启发吧。
一、问题诞生 -- 大部分解决方案的背后总是一些头痛的问题
很早以前就用过传说中的WebService,但一直是用常规的思路在用:创建WebService项目--&写Web服务方法--& 在项目中添加Web引用--&调用Web方法。这样貌似很好,非常符合规范,在一段时间内效果也还可以,但渐渐的随着项目的扩大和同时参与项目的人员增多,就越来越觉得这种常规的方法很是不爽,为什么呢?我每次修改WebService端(添加、删除Web方法,以及修改方法名称),在引用端我都要更新WebService引用,其实是就是更新WSDL文件,很是烦人。
二、化分为合 -- 传说分久必合,合久必分
好吧,既然增加、删除、修改web方法名都会引起WSDL的更新,那么我们索性用一个统一的方法来作为webservice的访问入口吧,然后内部用switch case来区分调用哪个方法,先贴代码吧,再来简单讲讲:
统一访问接口IRemoteCall:
public&interface&IRemoteCall{&&&& &byte[]&GeneralCall(string&methodName,&params&byte[]&param);}&
然后定义一个WebService并实现以上接口(以前还没真在webservice上实现过接口,哈哈):
[WebService(Namespace&=&)][WebServiceBinding(ConformsTo&=& &WsiProfiles.BasicProfile1_1)][ToolboxItem(false)]public&class&BlogService&:&System.Web.Services.WebService,&IRemoteCall{&&&& &[WebMethod(EnableSession&=&true)]&&& &&public&byte[]&GeneralCall(string&methodName,&params&byte[]&param)&&&&{&&&&&&&& &switch&(methodName)&&&&&&& &&{&&&&&&&&&& &&&case&&LoadBlog&:&&&&&&&&&& &&&&&&{&&&&&&&&&&&&&&& &&&&&long&blogId&=&Serializer.DeserializeToObject&long&(param);&&&&&&&&&&&&&&&&& &&&BLLBlogArtical&ba&=&new&AppBlog().LoadBlog(blogId);&&&&&&&&&&&&&&& &&&&&return&Serializer.SerializeToBinary(ba);&&&&&&&&&& &&&&&&}&&&&&&&&& &&&&case&&DeleteBlog&:&&&&&&&& &&&&&&&&{&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&return&null;&&&&&&&& &&&&&&&&}&& &&&&&&&&}&&&&&}}&
这里为什么要定义接口IRemoteCall呢,主要是为接下来统一调用webservice服务的,所有实现这个接口的webservice类都可以通过GeneralCall来完成调用,待会将webservice访问器的时候会具体讲到,这里主要讲讲这个switch case。
这里我们定义了一个统一的访问入口
byte[]&GeneralCall(string&methodName,params&byte[]&param)&
意思是:传入要调用的方法名称以及序列化后的参数,返回序列化后的结果。这里为了统一数据,我们均对参数和返回值都序列化成byte数组,即用Serializer.SerializeToBinary(object)来实现,这样所有调用就都统一了格式。
有人可能会提出质疑,这样方法名称都已字符串形式是不是会显得难看,而且字符串容易出错,还没有智能提示?那也好解决,我们可以把方法名称定义成const常量就可以了。这里我对webservice的一个态度是:webservice层就是完成转接和调度工作的,它仅仅起到承接的作用,用了他可以将服务任意分布,所以里面是没有任何逻辑的(逻辑都是被封装在其他dll中的),最多是一些数据转换,所以我采用了这种模糊接口的方式。
三、自定义webservice访问器
上面我们完成了webservice端的工作,接下来就来实现客户端对webservice的灵活调用,这里上面定义的那个IRemoteCall就起到作用了,首先我们定义一个webservice访问器类RemoteCaller,代码如下:
using&Susing& &System.Collections.Gusing& &System.Tusing& &System.Cusing&System.Web.Services.P &using&SharedLib_403;& &namespace&ITIvy.Shared.RemoteCaller{&&&& &&&&&&&&&&&&public&class&RemoteCaller&& &&&{&&&& &&&&&private&string&_MethodN&&& &&&&&&private&byte[]&_ParamB&&&& &&&&&private&IRemoteCall&_C&&&&& &&&&private&ArrayList&_P&&&&& &&&&&&&&&&&&&&&&public&ArrayList&Params&&&& &&&&&{&&&&&&&&& &&&&get&{&return&_P&}&&&&&&&&&& &&&set&{&_Params&=&&}&&&& &&&&&} &&&&&&&&&&&&&&&&&&&&&public&byte[]&ParamByte&&&&& &&&&{&&&&&& &&&&&&&get&{&return&_ParamB&}&&&& &&&&&&&&&set&{&_ParamByte&=&&}&&&&& &&&&}&&&&&&&&&&&&&&&&&&&&public&string&MethodName&& &&&&&&&{&&&&&& &&&&&&&get&{&return&_MethodN&}&&&&&& &&&&&&&set&{&_MethodName&=&&}&&&&& &&&&}&&&&&&&&&&&&&&&&&&&&&&public&IRemoteCall&Caller&& &&&&&&&{&&&&&&&& &&&&&get&{&return&_C&}&&&& &&&&&&&&&set&{&_Caller&=&&}&& &&&&&&&}&&&&&&&& &&&&&&&&&&&&&&&&&&public&RemoteCaller(IRemoteCall&caller)&&&&&&&&{&&&&&&&&&&& &&_Caller&=&&&&&&&&&&& &&&_Params&=&new&ArrayList();&&&& &&&&&}&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&public&byte[]&Call(string&methodName,&object&param)&&&&&&&&{&&&&&&&&& &&&&try&&&&&&&&&&&&{&&&&&&& &&&&&&&&&&_MethodName&=&methodN&&&&&&&&&&&&&&&&_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&&&&&&&&& &&&&&}&&&&&&&&}&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&public&byte[]&Call(string&methodName,&ArrayList&param)&&&&& &&&&{&&&&&&&&&& &&&try&&&&&&&&&& &&&{&&&&&& &&&&&&&&&&&_MethodName&=&methodN&&&&&&&&&&&&&&&&_Params&=&&&&&& &&&&&&&&&&&&_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&&&&&&&&&&&&&}& &&&&&&&&}&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&public&byte[]&Call(string&methodName,&params&object[]&param)& &&&&&&&&{&&&&&&& &&&&&&try&&&&&&&& &&&&&{&&&&&& &&&&&&&&&&&foreach&(object&obj&in&param)&&&&&&& &&&&&&&&&&&&&&_Params.Add(obj);&&&&&&&&&&&&&&&&_MethodName&=&methodN&&&&& &&&&&&&&&&&&_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&&&&&&&&&&&&&}&& &&&&&&&}&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&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&&&&&&&& &&&&&&}&&&&&&&&}&&&&&&& &&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&byte[]&resultByte&=&Call();&&&&&&&&&&&&return&Serializer.DeserializeToObject&T&(resultByte);&&&&&&&&}&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&public&T&Call&T&(string&methodName,&ArrayList&param)& &&&&&&&&{&&&&&&&&&& &&&byte[]&resultByte&=&Call(methodName,&param);&&&&&&&&&& &&&return&Serializer.DeserializeToObject&T&(resultByte);&&&&&& &&&}&&& &&&&&&&public&T&Call&T&(string&methodName,&object&param)&&&&&&&&{&&&&&&&& &&&&&try&&&&&&&&&&&&{&&&&&&&&&& &&&&&&&_MethodName&=&methodN&&&&&&&&&&&& &&&&&_ParamByte&=&Serializer.SerializeToBinary(param);&&&&&&&&&&&&&& &&&byte[]&resultByte&=&_Caller.GeneralCall(_MethodName,&_ParamByte);&&&&&&&& && &&&&&&&&return&Serializer.DeserializeToObject&T&(resultByte);&&&&&&&& &&&&&}&&&&&&&&&&&&catch&(Exception&ex)&&&&&&&&& &&&&{&&&&&& &&&&&&&&&&&if&(ex&is&SoapException)&&&&&&&&&&&&&&&&&&&&throw&new&Exception(((SoapException)ex).Detail[&Message&].InnerText);&&&&&&&&&&&&&&&&else&&&&&&&&&&&&&&&& &&&&&throw&&&&&&&&& &&&&&}&&&&&&&&}&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&public&T&Call&T&(string&methodName,&params&object[]&param)&&&&&& &&&{&&&&&&&& &&&&&byte[]&resultByte&=&Call(methodName,&param);&&&&&&&&& &&&&return&Serializer.DeserializeToObject&T&(resultByte);&&&&& &&&&}&&&&}} &&
这个访问器主要是定义了一系列访问接口的重载,利用了c#的泛型更加使接口简单了。哈哈,这个类就能让我们实现一句话调用webservice,相当简洁。注意里面的IRemoteCall属性,就是只要传入实现了该接口的类,就都可以通过该访问器来访问webservice。如何使用该类呢,下面给一个例子吧:
IRemoteCall Caller = new BlogService.BlogService();BLLBlogArtical bllArtical = new RemoteCaller(Caller).Call&BLLBlogArtical&(&LoadBlog&, id);
抱歉,说错了,要两句话来调用,但是这里少去了很多数据转换的工作,因为有了泛型,呵呵,而且我可以在RemoteCaller这个访问器类中做很多工作,比如异常处理,权限验证等等。
四、总结 -- 写了这么多不总结可不行
这个实现方法的核心在于用IRemoteCall接口来规范webservice类的实现方式均为统一GenerateCall,然后 webservice类中通过switch case来将所有方法整合在一起,避免频繁更新WSDL的麻烦,最后客户端利用IRemoteCall定义一个webservice访问器类 RemoteCaller来提供统一的webservice访问。
原文链接:/sxwgf/archive//something-about-webservice.html
【编辑推荐】
【责任编辑: TEL:(010)】
关于的更多文章
IE浏览器不支持很多CSS属性是出了名的,即便在支持的部分中,也
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
互联网一大真理便是,有痛点的地方就有机会。现在最想
Eclipse 是一个开源的、可扩展的集成开发环境。平台本
这个架构是从我近期在做的一个项目中剥离出来的,这个
本书从计算机网络安全的概念入手,分析了单机节点、单一网络、互联网络和开放互联网络的基本安全问题,并对计算机网络安全体系架
51CTO旗下网站}

我要回帖

更多关于 c 中调用webservice 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信