2013-03-23 71 views
2

我在C++/CLI dll項目(VS2012 Express)中引用System :: ServiceModel。以下代碼失敗,出現以下錯誤,我找不到如何修復它。未找到ServiceMetadataBehavior屬性WCF C++/CLI

錯誤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(); 
}; 

EDIT1:

需要說明的情況是,這是不可能的代碼,即完全寫的WCF服務沒有一個應用程序.config文件。雖然Service具有ServiceMetadataBehavior幫助器來創建元數據交換行爲實現,但Endpoint沒有這樣的事情。這是「按設計」嗎? How to: Publish Metadata for a Service Using Code

EDIT2:

OK,所以需要注意上面似乎沒有要,一定是正確的。下面是代碼中我想要做的事情的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執行合同的名單 被發現。直接向配置文件或 ServiceHost添加 ServiceMetadataBehavior以啓用對此合同的支持。

問題是,如果我將ServiceMetadataBehavior屬性添加到PlaybackManager類,我得到上面的原始錯誤,它不被識別。有任何想法嗎?

回答

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" 

顯然,這些提示是不是一個解釋,但我希望他們可以幫助別人一樣困惑,因爲我是當我問的問題。