2012-07-27 64 views
0

我的情況是這樣的。在每次調用我的Web服務時,我都有一個out參數,它是一個錯誤對象。如果沒有錯誤,則該對象通過空白表示。如果出現錯誤,那麼會填充不同的屬性,例如「HasError」字段,「ErrorMessage」,「PrettyMessage」等。我現在想要做的是創建不同類型的Error對象,它們都會實現一個錯誤我已經定義了接口。然後我希望能夠將out參數設置爲「out IMyError error」,然後能夠將該錯誤對象設置爲該接口的一個實現,具體取決於我在方法中遇到的錯誤類型。我得到的問題是序列化似乎不喜歡這個。該方法運行良好,但我沒有得到任何數據在客戶端。這裏有一些代碼希望澄清。將界面用作WCF Web服務中的輸出參數

我的界面

public interface IMyError 
{ 
    bool HasError { get; set; } 
    string ErrorType { get; set; } 
    string PrettyErrMsg { get; set; } 
} 

一個例子類實現

[Serializable] 
[DataContract] 
public class AspError : IMyError 
{ 
    public AspError(Exception exception) 
    { 
     this.HasError = true; 
     this.PrettyErrMsg = "An ASP Exception was thrown"; 
     this.ExceptionMsg = exception.Message; 
     this.StackTrace = exception.StackTrace; 
    } 

    [DataMember(Name = "has_error", IsRequired = true)] 
    public bool HasError { get; set; } 

    [DataMember(Name = "error_type", IsRequired = true)] 
    public string ErrorType 
    { 
     get 
     { 
      return "ASP"; 
     } 
     set 
     { 
     } 
    } 

    [DataMember(Name = "pretty_error", IsRequired = true)] 
    public string PrettyErrMsg { get; set; } 

    [DataMember(Name = "exception", IsRequired = true)] 
    public string ExceptionMsg { get; set; } 

    [DataMember(Name = "stack_trace", IsRequired = true)] 
    public string StackTrace { get; set; } 
} 

而在我的WCF服務的方法

public bool MyMethod(out IMyError error) 
{ 
    error = new MyError() { HasError = false }; 

    try 
    { 
     // do some code    
    } 
    catch (Exception exception) 
    { 
     error = new AspError(exception); 
     return false; 
    } 
} 

我想是該方法,當一個例外是被捕獲,返回一個AspError格式化爲json的方式,它在過​​去的工作方式之前,我嘗試了doin將其作爲接口。或者,如果發生不同類型的IMyError,則返回THAT類型,格式爲json。我認爲它可以工作,因爲它們都是IMyError類。

回答

3

您需要發送提示給客戶端如何反序列化您的界面。 WCF用KnownTypeAttribute來做到這一點。

您的服務應該改成這個樣子:

[KnownType(typeof(AspError))] 
public bool MyMethod(out IMyError error) 
{ 
    ... 
} 

您可以在MSDN中找到更多的細節 - http://msdn.microsoft.com/en-us/library/ms730167.aspx

當然你的客戶應該有AspError式訪問組件能構建該類型。

+0

謝謝。然而,一個澄清。我其實將屬性添加到wcf服務的接口類,而不是像你展示的方法。 – sanpaco 2012-07-27 18:31:07

+0

@sanpaco您是否認爲您已將'KnownTypeAttribute'添加到'AspError'或您的'IMyError'接口,因爲我認爲不可能在接口上添加'KnownType屬性',這隻能在'struct,枚舉或類' – 2016-06-07 15:11:41