专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > WCF

十五天精通WCF——第三天 client怎么知道server提供的功能清单

发布时间:2011-06-23 13:51:17 文章来源:www.iduyao.cn 采编人员:星星草
十五天精通WCF——第三天 client如何知道server提供的功能清单

    通常我们去大保健的时候,都会找姑娘问一下这里能提供什么服务,什么价格,这时候可能姑娘会跟你口述一些服务或者提供一份服务清单,这样的话大

家就可以做到童嫂无欺,这样一份活生生的例子,在wcf中同样是一个道理,只有client了解service能提供哪些功能,client才可以根据server提供的功能进行

消费,那问题来了,service怎么把功能提供给client进行选择呢???这个就是我这一篇要聊的wsdl(web service description language)。。。

 

一:wsdl

   现在你已经知道了,wsdl就是server提供给client的清单,那下面问题就来了。server是如何提供的呢???你要是比较仔细的话,可能会知道我在上一

篇提到的一个endpoint,如下截图。

在上面这幅图中,你可以看到,Homeservice提供了两个端点,一个是“服务端点“,一个是“元数据端点”。并且你也看到了,元数据的端点地址是

http://192.168.16.16:19200/mex,当client通过svcutil访问这个地址的时候,就拿到了server能提供的功能清单,然后client就可以根据这些功能生成一

个代理文件,然后的然后,就是你懂得,各种啪啪啪,XXXClient。

 

二:眼见为实

1.见证wsdl

 要想看见wsdl,你只需要通过http://localhost:19200打开服务地址、如下图:

 

然后点击:http://localhost:19200/?singleWsdl

 

现在你看到的就是server功能清单,太tmd的重量级了,已经完完全全果体在世人前了,下一小节我们再详细的分析下。

 

2. 见证client端的XXXclient

  刚才我也说了,当你用vs做“服务引用”的时候,svcutil会根据http://localhost:19200/mex的地址来查看wsdl,然后生成代理,下面我们具体来看一下。

 

 

点击确定之后,我们就可以看到在 Service References 文件夹下面生成了一个Reference.cs 文件。

 

然后我们打开Reference.cs,就可以看到一个继承于ClientBase的HomeServiceClient。

 

 

三:详细分析wsdl文件

  学wcf,你一定要像svcutil一样能够看得懂wsdl。

 

1. 首先看下server提供了一个Update操作,参数是一个id,一个Student这个自定义的复杂类型,同时返回也是Student这个

    复杂类型。

1 namespace MyService
2 {
3     [ServiceContract]
4     public interface IHomeService
5     {
6         [OperationContract]
7         Student Update(int id, Student stu);
8     }
9 }

 

 2. wsdl这个xml文件,刚才你也看到了,下面我们一个个节点看看

  <1> portType 和 operation节点

  当你看到下面的截图后,我想你也能猜的出来,portType就是契约(IHomeService),operation就是契约方法(Update),不过有点意思的是,在operation

下面你看到了一个input,一个output,这个就是所谓的 ”输入消息“,”输出消息”,那是什么意思呢??? 也就是说client到server的消息叫做“输入消息”,server到

client端叫做“输出消息”,到这里你应该似乎明白了,我C#中的Update方法是有入参和出参的,然而这映射到wsdl中就是两条消息,input和output,这个也就是经典

的“请求-响应“模式。

 

好了,继续往下看,在wsdl:input和wsdl:output中分别有一个Action属性,这个非常有意思,wcf的底层就是通过这个地址来找到对应的方法,比如我们看到的代理

类中的Update方法上面就有这么一段。

 

 <2> message 和 types节点

  继续往下看的话,你会发现input和output中还有一个message属性,对应的为IHomeService_Update_InputMessage和IHomeService_Update_OutputMessage,

这个正好是message节点的引用,如下图:

从这个图中,你可以看到input和output下面都有一个wsdl:part节点,这个就是表明input和output中需要携带的参数,比如element="tns:Update",就引用了

element中Name=Update的节点,如下图:

 

好了,最后我再截一张图,可以看到,传输协议为soap,服务地址等等。。。然后就没什么好说的了。

 

 

6楼玻璃鱼儿
分析的很好,“大保健”真不懂,代码倒是看懂了。其实WSDL就是以XML格式来描述的Web服务元数据(是一种自描述的格式),它是独立于其他语言的一种通用规范,就像HTML一样并不属于.NET也不属于JAVA是一个道理。但是为了方便.NET或者JAVA等等语言的开发者使用Web服务,那么就需要简化这些调用的细节,所以MS或者SUN等等就对它们进行了一番包装。就跟原生的HTML和ASP.NET的服务器控件的道理是一样,做的都是同一件事情。另外说一点,WSDL文件对于Web服务来说不是必须的,参见我的文章(直接通过POST方式调用Web服务,不用代理当然也就用不着WSDL了)http://www.cnblogs.com/huangzelin/p/4550076.html
5楼癡迷
看來樓主經常去大保健哦。
4楼其实我不笨
给力。。
3楼localpro
什么“大保健”,“公主”,我听不懂 O(∩_∩)O哈哈~
2楼幻天芒
随便问下,这个VS编辑器的全屏背景图,是用的什么扩展?
1楼幻天芒
博主对”大保健“很熟悉啊。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: