元数据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呢?

  1. If you want to make as less calls as possible to your service in order to get its metadata (one call instead of several).
  2. If you don’t want to use HTTP to get the metadata, but prefer using TCP or named pipes (not so common).
  3. If you want people to ask you why you declared a MEX endpoint.
posted @ 2013-04-14 21:54  BlueMountain_79  阅读(454)  评论(0编辑  收藏  举报