COM(VB/VBA/Script)利用服务标记调用WCF服务之二使用MEX契约2011-10-26 博客园 LazyBee第一步:创建WCF服务上一篇我们使用类型化契约的服务标记在COM中调用WCF服务,不过这个有一 定的局限性,因为需要注册类型,所以需要.Net FrameWork,但是在很多情况下COM客户端所在的环境没有 .Net Framework,比如说在Excel中,需要调用一个WCF服务来计算某个单元格的值,而且这个Excel文件可 能分发到许多机器上,你总不能给每台机器都装一个.Net Framework,同时都去给它注册所需的类型吧。 针对这种场景,我们可以使用MEX契约的服务标记来动态得到服务契约,这样就可以满足我们上面的场景 的要求了。下面就让我们开始吧!这个和上一篇的完全一样,具体请参见COM(VB/VBA/Script)利用服务标记调用WCF服务之一使用类型化 契约的第一步,如果您曾经按照上一篇文章做过相应的测试,你就可以直接使用已经建好的服务了。 第 二步:在Script中调用WCF服务 1 这里大家对比前面一篇就可以看到,这里没有任何创建客户端库以及注 册等步骤,而是直接进行调用WCF服务了。在写调用代码之前,首先让我们打开服务的WSDL来看看,因为 这里有我们需要的服务标记信息。 2 我们打开http://localhost/WCFServiceMoniker/Service1.svc? wsdl之后,如下图所示:

3 下面就是创建我们的Script文件了,我们起名为CallWCFService_mex.vbs,内容如下:
1"---------------------------------------------------------------2" MEX service moniker example3"---------------------------------------------------------------4" Create a string for the service moniker specifying the address5" to retrieve the service metadata from6mexMonikerString = "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 object11Set mexServiceMoniker = GetObject(mexMonikerString)12" Call the service operations using the moniker object13WScript.Echo mexServiceMoniker.SayHello("I am LazyBee, My blog is http://lazybee.cnblogs.com/ ")14Set mexServiceMoniker = nothing15
Mex地址、服务地址、绑定及命名空间、服务契约及命名空间四部分内容。在这里服务地址就是上图所 标注的地址,当然Mex地址就是在其后面增加一个mex了,这个对大家来说应该都很好理解。绑定及服务也 是上图所标注,不过注意其大小写,因为在服务标记中是区分大小写的,由于我们没有给服务契约和绑定 指定命名空间,缺省就是“http://tempuri.org/”了。