我試圖克服WCF和枚舉的問題,我試圖從服務器傳遞給客戶端(或另一臺服務器),其中包含一個枚舉的對象。有目的地,枚舉從1開始。一切都很好,當枚舉初始化和定義的值,但是當它沒有在枚舉中定義,我得到這個美好的(和非常描述性的(...))錯誤信息:枚舉和WCF - 有意義的錯誤?
「底層連接已關閉:連接意外關閉。「
我試圖實現的是,當我得到這個場景時,無論是從數據庫中的損壞數據(無論如何將其轉換爲enum,這完全相當奇怪),或者當開發人員忘記設置枚舉值時啓動對象,得到一個有意義的消息,如「Enum值無效,鍵入:{0},值:{1}」。
我試着在類的setter和getter中使用「Enum.IsDefined」,並將有意義的異常拋出到客戶端(或其他服務器),但仍然得到「連接關閉「錯誤(當允許調試服務器時,我得到有意義的消息,但僅在服務器端)。
這裏的枚舉二傳手&吸氣的一個片段:
private TestEnum m_TestEnum;
[DataMember]
public TestEnum TestEnum
{
get
{
if (Enum.IsDefined(typeof(TestEnum), m_TestEnum))
{
return m_TestEnum;
}
else
{
throw new ApplicationException("Enum value is not valid: " + m_TestEnum);
}
}
set
{
if (Enum.IsDefined(typeof(TestEnum), value))
{
m_TestEnum = value;
}
else
{
throw new ApplicationException("Enum value is not valid: " + value);
}
}
}
起價0枚舉(與「未知」值)還不夠好,因爲我仍然可以得到哪些沒有價值存在於枚舉中。我可以結合使用這兩種解決方案,在這裏我檢查「IsDefined」並將枚舉設置爲「未知」值,但仍然 - 這不是理想的解決方案,因爲我們想知道這些情況以便在開發週期中解決它們。
你說什麼? 謝謝, Nir。
只是爲了澄清一些事情:你** **不傳遞對象從客戶端到服務器 - 你傳遞一個**序列化消息**表示它們。客戶端上的所有「對象」都將被序列化,作爲消息發送(基於文本或基於二進制),然後在服務器上再次解除序列化(與迴應的方式相同)。只是要清楚 - 沒有*對象*被傳遞 – 2009-09-12 15:12:26
風格的小點 - 不要在代碼中使用ApplicationException。它不會比拋出'Exception'增加任何價值,因爲從來沒有直接捕獲'ApplicationException'的情況。框架設計師自己建議不要這樣做。這裏有一些信息:http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=56 – 2009-09-12 16:28:23
...相反,你可能會考慮使用'ArgumentOutOfRangeException'作爲setter(無論你是否需要getter或者不取決於默認字段值是否有效 – 2009-09-12 16:29:45