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:

これに対する注意点は、コードを使用して、つまりapp.configファイルを使用せずにwcfサービスを完全に作成することはできないということです。サービスには、メタデータ交換動作の実装を作成するためのServiceMetadataBehaviorヘルパーがありますが、エンドポイントにはそのようなものはありません。これは「設計による」ですか? 方法:コードを使用してサービスのメタデータを公開する

EDIT2:

わかりました。したがって、上記の警告は必ずしも正しいとは限りません。以下は、コードで実行しようとしていることを表す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>

エラーは次のとおりです。

コントラクト名「IMetadataExchange」が、サービスPlaybackManagerによって実装されたコントラクトのリストに見つかりませんでした。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 が追加されたエンドポイント) には独自の名前空間が必要なため、実装エンドポイントの uri アドレスの末尾に「/mex」を追加します。

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

明らかに、これらのヒントは説明ではありませんが、私が質問したときと同じように混乱している人の助けになることを願っています.

于 2013-04-11T04:58:48.993 に答える