2011-11-18 72 views
4

我正在使用ServiceStack創建接受來自HTML表單(POST)的請求的服務。其中DTO屬性是一個枚舉,而當輸入不枚舉成員匹配,我得到以下異常:處理ServiceStack中的序列化異常

Error occured while Processing Request: KeyValueDataContractDeserializer: Error converting to type: Requested value 'MyValue' was not found. 
System.Runtime.Serialization.SerializationException: KeyValueDataContractDeserializer: Error converting to type: Requested value 'MyValue' was not found. ---> System.ArgumentException: Requested value 'MyValue' was not found. 
    at System.Enum.TryParseEnum(Type enumType, String value, Boolean ignoreCase, EnumResult& parseResult) 
    at System.Enum.Parse(Type enumType, String value, Boolean ignoreCase) 
    at ServiceStack.ServiceModel.Serialization.StringMapTypeDeserializer.PopulateFromMap(Object instance, IDictionary`2 keyValuePairs) 

我如何可以攔截這個異常並處理它自己在我的服務代碼?

回答

3

有一對夫婦的方式來處理這種情況:

可以使DTO枚舉屬性的字符串(因爲一切都可以成功反序列化到一個字符串:),然後轉換是自己手動即

using ServiceStack.Common; //ToEnum<> is an extension method 

public class RequestDto 
{ 
    public string EnumString { get; set; } 
} 

public override object OnGet(RequestDto request) 
{ 
    MyEnum defaultValue = MyEnum.None; 
    try { 
     defaultValue = request.EnumString.ToEnum<MyEnum>(); 
    } catch {} 
} 

另一種方法是完全它從請求DTO手動從IHttpRequest語境等除去,並獲得值:

public class RequestDto {} 
public override object OnGet(RequestDto request) 
{ 
    MyEnum enumValue = MyEnum.DefaultValue; 
    try { 
     var enumStr = base.RequestContext.Get<IHttpRequest>().QueryString["EnumString"]; 
     enumValue = enumStr.ToEnum<MyEnum>(); 
    } catch {} 
} 

我通常不贊成在DTO上使用枚舉,原因很多,主要是在XML/SOAP端點上,XSD將它們視爲一組受限制的值,這是在迭代嘗試迭代發展Web服務時的一種痛苦,因爲您需要重新創造客戶以增加新的價值。

按照慣例,我處理它的方式是將所有枚舉作爲字符串,但在指向目標類型的DTO上提供一些元數據(這有助於VS.NET/R#導航和元數據工具)。

public class RequestDto 
{ 
    [References(typeof(MyEnum))] 
    public string EnumString { get; set; } 
} 
+0

感謝您提供非常詳細的回覆和偉大的建議。一個小小的評論 - 在我的情況下,我使用的是POST而不是GET,如問題所示,並且從ServiceBase繼承,覆蓋了Run方法,因此只需調整代碼示例以獲取DTO外部的值, d必須做 'var enumStr = base.RequestContext.Get ()。FormData [「FormElementName」]' 這只是爲了幫助其他人試圖做同樣的事情。很高興知道SS的這個功能。 – dawebber