我的服务没有svc文件。请参阅配置条目,并且明确注意到已为一个tcp端点声明了一个mex端点。
所以我的问题是,当我的服务有许多端点,如wshttp,wsDualhttp,tcp,m smq等,那么我是否需要为每种类型的不同端点声明mex端点?
这是托管服务的服务配置详细信息。
<services>
<service name="ChatService.ChatHandler" behaviorConfiguration="behaviorConfig">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:1648/ChatService/" />
<add baseAddress="http://localhost:1647/ChatService/" />
</baseAddresses>
</host>
<endpoint address="tcp"
binding="netTcpBinding"
bindingConfiguration="tcpBinding"
contract="ChatService.IChat"/>
<endpoint address="net.tcp://localhost:1645/ChatService/mex"
binding="mexTcpBinding"
contract="IMetadataExchange"/>
</service>
</services>
所以我从Marc_S的答案中了解到:即使没有任何MEX端点,我的服务也将全面运作。
如果有人想要与您的服务进行交互,您需要以其他方式提供相关信息,因为这些客户端无法“自动发现”并通过MEX检查服务 - 您必须例如提供你的WSDL和附带的XSD文件的下载,这样有人可以构建一个客户端,而无需交互式地查询你的服务的MEX端点....所以如果我不公开mex然后我必须创建wsdl文件,我必须将该wsdl传递给客户端手动....我是对的吗?
当mex被禁用时,客户端是否还有其他方法可以创建我的服务代理?
那么有没有办法从服务端确定哪个协议客户端用来调用我的服务....假设我有多个端点,如wshttp,wsdualhttp,tcp,msmq等?
答案 0 :(得分:3)
不需要元数据交换端点,您可以声明一个端点或创建没有任何元数据交换端点的服务
答案 1 :(得分:3)
MEX端点 - 正如其名称, Metadata EXchange 暗示 - 用于使您的服务可被发现,例如有人试图为您的服务编写客户端可以将他的浏览器和/或开发工具(如Visual Studio或svcutil
)指向此端点,并通过定义的数据交换,客户端可以找出您的服务提供的内容服务方法和数据结构。
这是一个非常好的方便 - 但实际上只需要创建客户端代理代码 - 通常只需要一次。
没有要求有MEX端点,或者如果您有安全意识,您可能会决定明确不公开该信息,供所有人查看和检查。即使没有任何 MEX端点,您的服务也将完全正常运行。如果有人想要与您的服务进行交互,您需要以其他方式提供相关信息,因为这些客户无法“自动发现”并通过MEX检查服务 - 您必须例如提供WSDL和随附XSD文件的下载,以便有人可以构建客户端,而无需交互式查询服务的MEX端点。
因此 - 无要求为您计划支持的每个协议(net.tcp
,http
)公开一个MEX端点。您可以非常轻松地使用不同的协议拥有五个不同的端点,但只暴露最常用的HTTP MEX端点(允许客户端和开发人员浏览浏览器中的MEX端点以获取“帮助页面”并查看内容WSDL =描述您的服务的Web服务描述语言文件)