簡體   English   中英

與WCF服務共享枚舉

[英]Sharing Enum with WCF Service

我有幾個不同的應用程序,其中我想分享一個C#枚舉。 我無法弄清楚如何在常規應用程序和WCF服務之間共享枚舉聲明。

這是情況。 我有2個輕量級的C#destop應用程序和一個WCF web服務,它們都需要共享枚舉值。

客戶1有

 Method1( MyEnum e, string sUserId );

客戶2有

Method2( MyEnum e, string sUserId );

Webservice有

ServiceMethod1( MyEnum e, string sUserId, string sSomeData);

我最初的目的是創建一個名為Common.dll的庫來封裝枚舉,然后在所有需要枚舉的項目中引用該庫。 但是,WCF使事情變得困難,因為您需要標記枚舉,使其成為服務的一個組成部分。 像這樣:

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}

[DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };  

那么....有沒有辦法在WCF服務和其他應用程序之間共享一個枚舉?

使用Common庫應該沒問題。 枚舉是可序列化的,不需要DataContract屬性。

請參閱: http//msdn.microsoft.com/en-us/library/ms731923.aspx

枚舉類型。 枚舉(包括標志枚舉)是可序列化的。 (可選)可以使用DataContractAttribute屬性標記枚舉類型,在這種情況下,參與序列化的每個成員都必須使用EnumMemberAttribute屬性進行標記

編輯:即便如此,將枚舉標記為DataContract並讓客戶端庫使用它也應該沒有問題。

我必須遇到過時的服務參考或其他問題。 我回去創建了一個包含枚舉的公共庫,一切正常。 我只是添加了對服務接口文件的使用引用。

using Common;  

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}

我刪掉了以下內容:

[DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };

我猜因為枚舉是通過ServiceKnownType引用的,所以不需要在[DataContract]或[Enumerator]的外部庫中標記它。

我有一個非常奇怪的問題,並認為它可能會有趣。 當我在數據合同中使用枚舉時,我也遇到了連接停止的問題。 我花了很長時間才發現真正的問題是什么:我使用了枚舉的int值。 它們以1而不是0開始。顯然,WCF要求序列化的枚舉值等於0。 如果你沒有在枚舉中聲明任何值,那么將從0開始為你做一個自動的int值映射,所以一切都很好。 但是當你復制粘貼一些其他枚舉定義,其中沒有分配0值時,你不會通過WCF將它傳達給你的客戶端 - 奇怪但是真實!

你可以為你的枚舉成員分配int值,只需使用int進行傳輸,並在必要時將它們重新放入你的枚舉類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM