2012-07-27 2 views
0

내 상황은 이렇습니다. 내 웹 서비스를 호출 할 때마다 오류 개체 인 out 매개 변수가 있습니다. 오류가 없으면 객체는 비어 있음을 나타냅니다. 오류가있는 경우 "HasError"필드, "ErrorMessage", "PrettyMessage"등과 같이 다른 속성이 채워집니다. 지금이 작업과 관련된 모든 작업은 오류를 구현하는 다양한 유형의 오류 개체를 만듭니다 내가 이미 정의한 인터페이스. 그런 다음 out 매개 변수를 "out IMyError error"와 같은 식으로 사용할 수있게하고 내 메서드에서 어떤 종류의 오류가 발생하는지에 따라 해당 인터페이스의 구현 중 하나에 해당 오류 개체를 설정할 수있게하려고합니다. 내가 얻는 문제는 직렬화가 이것을 좋아하지 않는다는 것이다. 이 메서드는 잘 실행되지만 클라이언트 측에서 데이터를 다시 얻지는 못합니다. 희망적으로 명확히하는 몇 가지 코드가 있습니다.WCF 웹 서비스에서 out 매개 변수로 인터페이스 사용

내 인터페이스

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; 
    } 
} 

내가 원하는 것이 그 방법입니다, 잡아, JSON으로 포맷 된 AspError를 반환하기 전에 doin을 시도하기 전에 과거에 작동했던 방식으로 그것을 인터페이스로 사용하십시오. 또는 다른 구현 클래스의 IMyError가 발생하면 json으로 형식이 지정된 THAT 유형을 반환합니다. 그들은 모두 IMyError 클래스이기 때문에 작동 할 수 있다고 가정했습니다.

답변

3

인터페이스를 역 직렬화하는 방법에 대한 힌트를 클라이언트에 보내야합니다. WCF는 KnownTypeAttribute을 사용합니다.

서비스는 다음과 같이 변경해야합니다

: 당신은 MSDN에서 자세한 내용을 찾을 수 있습니다

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

- http://msdn.microsoft.com/en-us/library/ms730167.aspx

물론 유형 AspError와 어셈블리에 액세스 할 수 있어야 클라이언트가 수 있기 그 유형을 구성하십시오.

+0

감사합니다. 그러나 하나의 설명. 사실 wcf 서비스의 인터페이스 클래스에 속성을 추가했으나 사용자가 보여준 것과 같은 메서드는 추가하지 않았습니다. – sanpaco

+0

@sanpaco 당신이'KnownTypeAttribute'를'AspError' 나'IMyError' 인터페이스에 추가했다는 것은 인터페이스에'KnownType 속성 '을 추가 할 수 없다고 생각했기 때문에'struct, 열거 형 또는 클래스' –

관련 문제