随笔-27  评论-151  文章-10  trackbacks-15

COM(VB/VBA/Script)利用服务标记调用WCF服务

之二使用MEX契约

LazyBeehttp://lazybee.cnblogs.com

上一篇我们使用类型化契约的服务标记在COM中调用WCF服务,不过这个有一定的局限性,因为需要注册类型,所以需要.Net FrameWork,但是在很多情况下COM客户端所在的环境没有.Net Framework,比如说在Excel中,需要调用一个WCF服务来计算某个单元格的值,而且这个Excel文件可能分发到许多机器上,你总不能给每台机器都装一个.Net Framework,同时都去给它注册所需的类型吧。针对这种场景,我们可以使用MEX契约的服务标记来动态得到服务契约,这样就可以满足我们上面的场景的要求了。下面就让我们开始吧!

 

第一步:创建WCF服务

    这个和上一篇的完全一样,具体请参见COM(VB/VBA/Script)利用服务标记调用WCF服务之一使用类型化契约的第一步,如果您曾经按照上一篇文章做过相应的测试,你就可以直接使用已经建好的服务了。

 

第二步:在Script中调用WCF服务

1 这里大家对比前面一篇就可以看到,这里没有任何创建客户端库以及注册等步骤,而是直接进行调用WCF服务了。在写调用代码之前,首先让我们打开服务的WSDL来看看,因为这里有我们需要的服务标记信息。

2 我们打开http://localhost/WCFServiceMoniker/Service1.svc?wsdl之后,如下图所示:

下面就是创建我们的Script文件了,我们起名为CallWCFService_mex.vbs,内容如下:

 1'---------------------------------------------------------------
 2' MEX service moniker example
 3'---------------------------------------------------------------
 4' Create a string for the service moniker specifying the address
 5' to retrieve the service metadata from
 6mexMonikerString = "service:mexAddress='http://localhost/WCFServiceMoniker/Service1.svc/mex'"
 7mexMonikerString = mexMonikerString + ", address='http://localhost/WCFServiceMoniker/Service1.svc'"
 8mexMonikerString = mexMonikerString + ",binding=WSHttpBinding_IService1, bindingNamespace='http://tempuri.org/'"
 9mexMonikerString = mexMonikerString + ", contract=IService1, contractNamespace='http://tempuri.org/'"
10' Create the service moniker object
11Set mexServiceMoniker = GetObject(mexMonikerString)
12' Call the service operations using the moniker object
13WScript.Echo  mexServiceMoniker.SayHello("I am LazyBee, My blog is http://lazybee.cnblogs.com/ ")
14Set mexServiceMoniker = nothing
15


注意:在我们服务标记字符串中,包含Mex地址、服务地址、绑定及命名空间、服务契约及命名空间四部分内容。在这里服务地址就是上图所标注的地址,当然Mex地址就是在其后面增加一个mex了,这个对大家来说应该都很好理解。绑定及服务也是上图所标注,不过注意其大小写,因为在服务标记中是区分大小写的,由于我们没有给服务契约和绑定指定命名空间,缺省就是“http://tempuri.org/”了。

4 保存之后,直接双击运行,你就可以看到运行结果了:

 

第三步:在VBA的宏中调用WCF服务

1 VBA中的代码和上一篇文章COM(VB/VBA/Script)利用服务标记调用WCF服务之一使用类型化契约的一样,只是将服务标记字符串和上面一样做相应的更改就可以了,如下所示:

2 直接运行,同样能得到上图类似的结果。

 

Code

注:在VB6中调用和上面的代码一样。

 

本文的源代码下载地址为:http://files.cnblogs.com/LazyBee/WCFServiceMoniker_MEX.Zip

(转载请注明出处:http://lazybee.cnblogs.com

posted on 2008-07-25 10:54 懒蜜蜂 阅读(819) 评论(10)  编辑 收藏 所属分类: WCF

评论:
#1楼  2008-07-25 11:28 | jillzhang      
动作真快!
  回复  引用  查看    
#2楼 [楼主] 2008-07-25 11:31 | 懒蜜蜂      
@jillzhang
呵呵,谢谢捧场!
  回复  引用  查看    
#3楼  2008-07-25 11:48 | jillzhang      
在帮助用户更好调用服务上,wcf就比xml web service差了
xml web service会告诉你在soap1.1和soap1.2中合格的报文格式,而wcf却让你傻傻的看wsdl,有点太不人性化了
  回复  引用  查看    
#4楼  2008-07-25 12:05 | Steven Chen      
--引用--------------------------------------------------
jillzhang: 在帮助用户更好调用服务上,wcf就比xml web service差了
xml web service会告诉你在soap1.1和soap1.2中合格的报文格式,而wcf却让你傻傻的看wsdl,有点太不人性化了
--------------------------------------------------------
同意


俄 第一次见lz这种用法

  回复  引用  查看    
#5楼 [楼主] 2008-07-25 12:09 | 懒蜜蜂      
@jillzhang
关于服务标记微软的文档介绍不详细,这种看WSDL的做法是我自己总结的一种方式,不知道微软有没有更好的方法,所以目前来说同意兄台的观点:)
  回复  引用  查看    
#6楼 [楼主] 2008-07-25 12:13 | 懒蜜蜂      
@Steven Chen
这个也是前一段时间给客户进行一个可行性的试验上找到的一种方式,不过就是介绍这方面的文章太少了,微软也是一笔带过,所以写出来与大家分享。
  回复  引用  查看    
#7楼  2008-07-25 13:25 | A.Z! [未注册用户]
不copy了装2008的朋友自己可以去看ms-help://MS.MSDNQTR.v90.en/wcf_con/html/a88d9650-bb50-4f48-8c85-12f5ce98a83a.htm
  回复  引用    
#8楼 [楼主] 2008-07-25 13:36 | 懒蜜蜂      
@A.Z!
谢谢捧场!上面是英文版的位置,装中文版MSDN的位置是:
ms-help://MS.MSDNQTR.v90.chs/wcf_con/html/ee3cf5c0-24f0-4ae7-81da-73a60de4a1a8.htm,不过MSDN中没有写明如何取上面的这些绑定及命名空间等信息。
  回复  引用  查看    
#9楼  2008-07-25 21:46 | BAsil      
不错,支持一下
  回复  引用  查看    
#10楼 [楼主] 2008-07-28 09:01 | 懒蜜蜂      
@BAsil
谢谢捧场!
  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: