元数据WSDL vs Mex
大概翻译了一下。
来源:http://blogs.microsoft.co.il/blogs/idof/archive/2011/08/10/wsdl-vs-mex-knockout-or-tie.aspx
当教WCF时候经常被问到,通过WSDL的Http-GET网址方式获取服务的元数据 与 通过调用MEX终结点获取元数据,这两种方式之前的区别。
为了回答这个问题,我们首先需要理解影响元数据产生的配置的差异部分:
- The ServiceMetadata behavior
这个behavior控制是否产生服务的元数据。当使用该behavior时,服务被扫描,并且服务契约(服务暴露的一组操作和类型)的元数据被创建。当不使用behavior时,服务的元数据不被创建,并且也不能产生mex终结点。
- The ServiceMetadata’s httpGetEnabled flag
这个flag定义了是否可以通过http-get请求访问元数据。如果这个属性被设置为true,则元数据的默认url将被创建(通常是服务的地址+“?wsdl”后缀)。这个url将导向一个wsdl文件,该文件包含服务操作的描述,不包含数据契约的描述。这些文件需要通过不同的地址们访问,通常是服务的url+“?xsd=xsdN”后缀。WSDL文件里有这些url的列表。
如果没有将这个属性设置为true,将不能采用http-get请求方式访问元数据。如果希望使用https获取请求,则可以使用httpsGetEnabled属性。
针对get选项还有其它几种设置,可以在http://msdn.microsoft.com/en-us/library/ms731317.aspx查到。
- The MEX endpoint
MEX终结点是一种允许客户端通过SOAP信息的方式接收服务端的元数据的特殊的终结点(不通过http-get请求)。创建的MEX终结点可通过http,https,tcp,甚至name pipes访问。
调用一个MEX终结点的GetMetaData操作返回的响应,将包含WSDL的内容和WSDL链接到的所有的XSD文件。
- So what exactly is the difference between MEX and WSDL?
没有区别!
MEX和WSDL两者都输出相同的东西——一个web service description language(WSDL)文档。MEX通过一些传输(http、tcp、named pipes)获取一条SOAP信息,这条信息包含了所有部分,包括wsdl和xsd内容。而WSDL网址们使用http-get请求,并且需要几次请求才能获取所有的部分。
在翻译的这篇文章中作者对比了一下MEX的元数据文件和http-get方式下的几个文件的集合之间的差异,最终的结论是:他们的区别仅仅是因为使用WSDL文件,XSD文件是使用<xsd:import>标签的schemaLocation属性链接在WSDL文件中,而MEX响应本身就包含所有的XSD内容,import标签不需要包含location属性造成的。
- So they are the same, still, which one to use?
在很多情况下并不需要使用MEX终结点,使用http-get获取WSDL就足够了。
vs2010的“Add Service Reference”选项支持这两种元数据方式。svcutil命令行工具同样支持。
那么什么时候使用MEX呢?
- If you want to make as less calls as possible to your service in order to get its metadata (one call instead of several).
- If you don’t want to use HTTP to get the metadata, but prefer using TCP or named pipes (not so common).
- If you want people to ask you why you declared a MEX endpoint.