我正在学习IIS中的WCF部署,我发现了一些奇怪的东西。基本上我的服务只使用默认行为,无论我如何在web.config中设置元素的behaviorConfiguration属性。
所以这是我的web.config的相关部分:
<system.serviceModel>
<services>
<service name="TableImport" behaviorConfiguration="MyServiceTypeBehaviors">
<endpoint address="" binding="wsHttpBinding" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="false" />
</behavior>
<behavior name="MyServiceTypeBehaviors" >
<serviceMetadata httpGetEnabled="true" policyVersion="Policy15" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
如您所见,默认的serviceMetadata元素具有httpGetEnabled =“false”,而MyServiceTypeBehaviors serviceMetadata元素具有httpGetEnabled =“true”。您还可以看到我的服务的behaviorConfiguration属性设置为“MyServiceTypeBehaviors”。
结果应该是我的服务通过浏览器发布元数据并通过Visual Studio“添加服务引用”功能得到相同的结果:没有元数据。
另一方面,如果我在默认行为中启用元数据并在“MyServiceTypeBehaviors”中禁用它并继续让我的服务使用MyServiceTypeBehaviors,那么我将通过浏览器和VS获取元数据。
对我来说,这些测试表明我的服务使用默认行为,无论我如何设置配置文件......但同时我可以通过web.config 更改默认行为我的web.config实际上能够影响服务的工作方式。有什么想法吗?
答案 0 :(得分:0)
您没有在端点中指定合同,因此如果没有合同,端点就无法知道它正在使用哪种服务。
如果您使用的是.NET 4.0或更高版本(并且基于您所描述的问题,它听起来就像您一样),那么您实际上是在连接到基于服务地址的默认端点。默认端点由框架提供。
因此,它将使用默认服务行为。这符合您的问题描述:
- When the default behavior's httpGetEnabled is set to false, you get no metadata. - When the default behavior's httpGetEnabled is set to true, you get the metadata.
在这种情况下,最简单的解决方案是简单地将合同添加到您尝试定义的端点:
<endpoint address="" binding="wsHttpBinding" contract="FullyQualified.IContractName" />
答案 1 :(得分:-1)
您需要添加“元数据”或“MEX”端点。将配置的服务部分改为:
<services>
<service name="TableImport" behaviorConfiguration="MyServiceTypeBehaviors">
<endpoint address="" binding="wsHttpBinding" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>