0

我正在学习 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 实际上能够影响服务如何运作。有任何想法吗?

4

2 回答 2

0

您没有在端点中指定合同,因此如果没有合同,端点将不会知道它正在使用什么服务。

如果您使用的是 .NET 4.0 或更高版本(并且根据您所描述的问题听起来像您),您实际上是在连接到基于服务地址的默认端点。默认端点由框架提供。

因此,它将使用默认服务行为。这符合您的问题描述:

- 当默认行为的 httpGetEnabled 设置为 false 时,您将不会获得任何元数据。
- 当默认行为的 httpGetEnabled 设置为 true 时,您将获得元数据。

在这种情况下,最简单的解决方案是简单地将合同添加到您尝试定义的端点:

<endpoint address="" binding="wsHttpBinding" contract="FullyQualified.IContractName" />
于 2013-05-14T23:07:00.163 回答
-1

您需要添加“元数据”或“MEX”端点。将配置的服务部分更改为如下所示:

     <services>
     <service name="TableImport" behaviorConfiguration="MyServiceTypeBehaviors">
        <endpoint address="" binding="wsHttpBinding" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
     </service>
   </services>
于 2013-05-14T19:51:18.740 回答