Dot-Net

如何以程式方式配置 WCF 已知類型?

  • April 21, 2009

我的客戶端/伺服器應用程序使用 WCF 進行通信,這非常棒。然而,目前架構的一個缺點是我必須對某些傳輸類型使用已知類型配置。我使用的是內部 Pub/Sub 機制,這個要求是不可避免的。

問題是很容易忘記添加已知類型,如果你這樣做了,WCF 會默默地失敗,幾乎沒有關於出錯的線索。

在我的應用程序中,我知道要發送的類型集。我想以程式方式執行配置,而不是通過App.config目前包含以下內容的文件以聲明方式執行配置:

<system.runtime.serialization>
 <dataContractSerializer>
   <declaredTypes>
     <add type="MyProject.MyParent, MyProjectAssembly">
       <knownType type="MyProject.MyChild1, MyProjectAssembly"/>
       <knownType type="MyProject.MyChild2, MyProjectAssembly"/>
       <knownType type="MyProject.MyChild3, MyProjectAssembly"/>
       <knownType type="MyProject.MyChild4, MyProjectAssembly"/>
       <knownType type="MyProject.MyChild5, MyProjectAssembly"/>
     </add>
   </declaredTypes>
 </dataContractSerializer>
</system.runtime.serialization>

相反,我想做這樣的事情:

foreach (Type type in _transmittedTypes)
{
   // How would I write this method?
   AddKnownType(typeof(MyParent), type);
}

有人可以解釋一下我該怎麼做嗎?

編輯請理解,我試圖在執行時動態設置已知類型,而不是在配置中以聲明方式或在原始碼中使用屬性。

這基本上是關於 WCF API 的問題,而不是樣式問題。

編輯 2 這個 MSDN 頁面頁面狀態:

您還可以將類型添加到通過 DataContractSerializer 的 KnownTypes 屬性訪問的 ReadOnlyCollection。

不幸的是,這就是它所說的全部,並且鑑於 KnownTypes 是一個只讀屬性,並且該屬性的值是 a ,它並沒有多大意義ReadOnlyCollection

添加[ServiceKnownType]到您的[ServiceContract]界面:

[ServiceKnownType("GetKnownTypes", typeof(KnownTypesProvider))]

然後創建一個名為KnownTypesProvider

internal static class KnownTypesProvider
{
   public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
   {
        // collect and pass back the list of known types
   }
}

然後你可以傳回你需要的任何類型。

引用自:https://stackoverflow.com/questions/771560