2

我在我的 C++/CLI dll 项目(VS2012 Express)中引用 System::ServiceModel。以下代码失败并出现以下错误,我找不到解决方法。

错误 C2337:“ServiceMetadataBehavior”:找不到属性

[System::ServiceModel::ServiceContractAttribute]
[System::ServiceModel::Description::ServiceMetadataBehavior]
public ref class PlaybackManager
{
public:
    ~PlaybackManager() { this->!PlaybackManager(); }
    !PlaybackManager() {  }

    // Playback action methods
    [System::ServiceModel::OperationContractAttribute]
    void Play();
    [System::ServiceModel::OperationContractAttribute]
    void Stop();
    [System::ServiceModel::OperationContractAttribute]
    void Pause();
    [System::ServiceModel::OperationContractAttribute]
    void Previous();
    [System::ServiceModel::OperationContractAttribute]
    void Next();
    [System::ServiceModel::OperationContractAttribute]
    void Random();
};

编辑1:

需要注意的是,不可能完全用代码编写 wcf 服务,即没有 app.config 文件。虽然服务有 ServiceMetadataBehavior 帮助器来创建元数据交换行为实现,但端点没有这样的东西。这是“设计”吗? 如何:使用代码发布服务的元数据

编辑2:

好的,所以上面的警告似乎不一定是正确的。下面是 app.config 代表我在代码中尝试执行的操作,如果我将 ServiceMetatdataBehavior 属性删除到端点类实现,我会得到相同的错误。

<configuration>
  <system.serviceModel>
    <services>
      <service name="Engine.PlaybackManager">

        <endpoint
          address="net.tcp://localhost:7008/PlaybackManager"
          binding="mexTcpBinding"
          contract="IMetadataExchange"
          />

        <endpoint
          address="net.tcp://localhost:7008/PlaybackManager"
          binding="netTcpBinding"
          contract="Engine.PlaybackManager"
          />
      </service>
    </services>

  </system.serviceModel>
</configuration>

错误是:

在服务 PlaybackManager 实施的合同列表中找不到合同名称“IMetadataExchange”。将 ServiceMetadataBehavior 添加到配置文件或直接添加到 ServiceHost 以启用对此协定的支持。

问题是,如果我将 ServiceMetadataBehavior 属性添加到 PlaybackManager 类,我会得到上面的原始错误,即无法识别。有任何想法吗?

4

1 回答 1

0

我理解为什么没有人对此做出回应,“我从哪里开始”是唯一可能的回应。因此,如果有人遇到与我一样的困惑,这里有一些提示:

我的主要问题是将 xml 配置命名法(在大多数在线示例中找到)与代码等效项进行映射:

<services> maps to System::ServiceModel::ServiceHost
<behaviors> maps to "your instance of ServiceHost"->Description->Behaviors
<behavior> is type specific, the type being a nested element in the xml, thus:
<behavior> <serviceMetadata /> </behavior> maps to ServiceMetadataBehavior
<endpoint> maps to ServiceEndpoint

最后:mex 端点(添加了 ServiceMetadataBehavior 的端点)需要它自己的命名空间,因此将“/mex”添加到实现端点 uri 地址的末尾。

example:
implementation address = "net.tcp://localhost:5000/Engine"
mex address =            "net.tcp://localhost:5000/Engine/mex"

显然,这些提示不是解释,但我希望它们可以帮助像我问这个问题时一样困惑的人。

于 2013-04-11T04:58:48.993 回答