2008-08-04 51 views
20

我的兩難問題基本上是如何在兩個應用程序之間共享枚舉。如何將枚舉值傳遞給Web服務

用戶通過Web上的前端應用程序上傳文檔。此應用程序調用後端應用程序的Web服務並將文檔傳遞給它。後端應用程序保存文檔並在表格中插入一行。

文檔類型(7可能的文檔類型:發票合同等)作爲一個參數到web服務的UploadDocument方法傳遞。問題是,這個參數的類型(和可能的值)應該是什麼?

由於您需要在這兩個應用程序中對這些值進行硬編碼,我認爲這是O.K.使用描述字符串(發票合同工作單SignedWorkOrder)。

在第一個應用程序中創建一個DocumentTypes枚舉並在第二個應用程序中重現它,然後將相應的整數值傳遞給它們之間的Web服務可能是更好的方法嗎?

回答

3

我只能說.net,但如果您有一個ASP.net Web服務,您應該能夠直接添加一個枚舉。

然後,當您在您的客戶端應用程序使用「添加Web引用」,結果Class對象應包括枚舉

但是,這是從我的頭頂,我敢肯定,我已經做到了在過去,但我不能肯定地說。

+0

'添加Web引用'確實會創建枚舉,但只會引用某些方法中引用的枚舉。我可以手動將枚舉添加到自動生成的Reference.cs文件,並且一切正常。也許這是單獨的問題,但有什麼辦法可以讓'添加Web引用'添加引用程序集中的所有枚舉(但未在代碼中使用),而無需手動黑客入侵Reference.cs文件? – 2010-12-07 14:43:22

6

我建議不要在它們之間傳遞一個整數,只是出於可讀性和調試的目的。假設你正在瀏覽你的日誌,並且你發現DocumentType = 4有500個錯誤。現在,您必須查找哪個DocumentType爲4.或者如果其中一個應用程序引用另一箇中不存在的數字,可能是由於版本不匹配。

這是一個多一點的代碼,它將大腦的靜態類型部分磨蹭成一點點粗糙,但在HTTP之上的協議中,接收到的智慧是在不透明的枚舉上使用清晰的字符串。

6

我仍然會在內部使用枚舉,但希望消費者只傳遞名稱,而不是數字值本身。

只是一些無聊的例子來說明:

public enum DocumentType 
{ 
    Invoice, 
    Contract, 
    WorkOrder, 
    SignedWorkOrder 
} 

[WebMethod] 
public void UploadDocument(string type, byte[] data) 
{ 
    DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type); 
} 
3

在.NET中,枚舉值(默認)序列化到與名稱XML。對於可以有多個值的情況(flags),則會在值之間留出空格。這是有效的,因爲枚舉不包含空格,所以你可以通過分割字符串來重新獲得值(即「使用lubos的例子」Invoice Contract SignedWorkOrder「)。

在使用WCF時,您可以使用XmlEnumAttribute或使用EnumMember屬性來控制asp.net Web服務中值的序列化。

3

如果您正在使用.NET頁面/應用程序使用Web服務,那麼在將Web引用添加到使用服務的項目之後,應該可以訪問該枚舉。

0

我注意到,當使用「添加服務引用」而不是VS.net中的「添加Web引用」時,實際的枚舉值以及枚舉名稱都會出現。這真的很煩人,因爲我需要同時支持2.0和3.5客戶端。我最終不得不進入2.0生成的Web服務代理代碼,並在每次進行更改時手動添加枚舉值!

3

如果您不使用.NET到.NET SOAP,您仍然可以定義一個枚舉器,只要兩個端點都使用WSDL。

<s:simpleType name="MyEnum">  
    <s:restriction base="s:string"> 
      <s:enumeration value="Wow"/> 
      <s:enumeration value="This"/> 
      <s:enumeration value="Is"/> 
      <s:enumeration value="Really"/> 
      <s:enumeration value="Simple"/> 
    </s:restriction> 
</s:simpleType> 

它由WSDL - >代理生成器工具將其解析爲客戶端語言中的枚舉等價物。

2

在這樣的界面邊界上沒有使用enum s有一些相當好的理由。考慮關於這個主題的Dare's post