[转]十五天精通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这个
复杂类型。
namespace MyService
{
[ServiceContract]
public interface IHomeService
{
[OperationContract]
Student Update(int id, Student stu);
}
}
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,服务地址等等。。。然后就没什么好说的了。
[转]十五天精通WCF——第三天 client如何知道server提供的功能清单的更多相关文章
- 十五天精通WCF——第三天 client如何知道server提供的功能清单
通常我们去大保健的时候,都会找姑娘问一下这里能提供什么服务,什么价格,这时候可能姑娘会跟你口述一些服务或者提供一份服务清单,这样的话大 家就可以做到童嫂无欺,这样一份活生生的例子,在wcf中同样是一 ...
- 十五天精通WCF——第十天 学会用SvcConfigEditor来简化配置
我们在玩wcf项目的时候,都是自己手工编写system.serviceModel下面的配置,虽然在webconfig中做wcf的服务配置的时候,vs提供大多 数的代码提示,但对于不太熟悉服务配置的小鸟 ...
- [转]十五天精通WCF——第十天 学会用SvcConfigEditor来简化配置
我们在玩wcf项目的时候,都是自己手工编写system.serviceModel下面的配置,虽然在webconfig中做wcf的服务配置的时候,vs提供大多 数的代码提示,但对于不太熟悉服务配置的小鸟 ...
- 十五天精通WCF——第一天 三种Binding让你KO80%的业务
转眼wcf技术已经出现很多年了,也在.net界混的风生水起,同时.net也是一个高度封装的框架,作为在wcf食物链最顶端的我们所能做的任务已经简单的不能再简单了, 再简单的话马路上的大妈也能写wcf了 ...
- [转]十五天精通WCF——第一天 三种Binding让你KO80%的业务
转眼wcf技术已经出现很多年了,也在.net界混的风生水起,同时.net也是一个高度封装的框架,作为在wcf食物链最顶端的我们所能做的任务已经简单的不能再简单了, 再简单的话马路上的大妈也能写wcf了 ...
- 十五天精通WCF——第五天 你需要了解的三个小技巧
一: 服务是端点的集合 当你在开发wcf的时候,你或许已经注意到了一个service可以公布多个endpoint,确实是这样,在wcf中有一句很经典的话,叫做“服务是端点的集合",就 比如说 ...
- [转]十五天精通WCF——第五天 你需要了解的三个小技巧
一: 服务是端点的集合 当你在开发wcf的时候,你或许已经注意到了一个service可以公布多个endpoint,确实是这样,在wcf中有一句很经典的话,叫做“服务是端点的集合",就 比如说 ...
- 十五天精通WCF——第十四天 一起聊聊FaultException
我们在玩web编程的时候,可能你会不经意的见到一些http500的错误,我想你应该不会陌生的,原因你应该也知道,服务器异常嘛, 这时候clr会把这个未处理的异常抛给iis并且包装成http500的错 ...
- [转]十五天精通WCF——第十四天 一起聊聊FaultException
我们在玩web编程的时候,可能你会不经意的见到一些http500的错误,我想你应该不会陌生的,原因你应该也知道,服务器异常嘛, 这时候clr会把这个未处理的异常抛给iis并且包装成http500的错 ...
随机推荐
- [Apple开发者帐户帮助]六、配置应用服务(5.3)推送通知(APN):从您的Web服务器发送推送通知
要使用APN从Web服务器向macOS用户发送推送通知,请注册网站推送标识符并创建网站推送证书. 对于每个网站,请注册一个网站推送标识符,用于验证通知是否来自您的服务器.然后创建一个网站推送证书以签署 ...
- idea ssm项目移包报错问题
写完代码之后发现包结构太乱了 想要规划一下 结果报错 这里面的包路径都可以点进去,还是报找不到com.lf.company.entity.Business 后来发现是 在移动前和移动后都存在这个m ...
- Git学习之序
最近在忙毕业论文的事,需要用NS2仿真,其中需要修改NS2的源码,故想藉此机会学习一下Git,方便代码的管理. 由于我在以前实习的时候接触过代码管理工具SVN,因此对代码管理的一些概念还是有的.如果从 ...
- 关于static函数在类中的定义和使用
刷题的时候遇到了这样一个问题:平时经常使用 sort()函数, 对结构体进行排序, 但是在类中使用时会出现 这样的错误提示:“Solution::cmp”: 函数调用缺少参数列表:请使用“&S ...
- iOS图片瘦身总结
前言 最近在公司写了个小程序来为iOS应用中的图片瘦身,进而减小APP大小,减少用户下载时的流量. 瘦身是在一个专门为图片瘦身的网站进行的. 地址:https://tinypng.com 这个网站提供 ...
- 【PL/SQL】九九乘法口诀表
--输出屏幕信息 SET serveroutput ON; --打印口诀表 DECLARE V_NUMBER1 ); --外层循环变量 V_NUMBER2 ); --内层循环变量 BEGIN .. - ...
- JS高级——静态成员与实例成员
静态成员:构造函数的属性和方法 实例成员:实例化之后对象的属性和方法 // $("#id").css(); // $("#id").text(); // $.t ...
- Zynq7000系列之芯片系统结构概述
相比较经典的FPGA,Zynq7000系列最大的特点是将处理系统PS和可编程资源PL分离开来,固化了PS系统的存在,实现了真正意义上的SOC(System On Chip). 1. Zynq7000 ...
- JQuery文档加载完成执行js的几种方法
js中文档加载完毕.一般在body加一个onload事件或者window.onload = function () {} jQuery中有好多写法,平时也不注意,别人一问,还真觉得头大. 下面是我整理 ...
- 关于Python中的classmethod
Python 中的 classmethod classmethod: 作用是直接将自己的类对象,传给类方法. 一.classmethod 1)不用classmethod的时候 你的代码可能是这样写的, ...