0

我的情况是这样的。在每次调用我的 Web 服务时,我都有一个 out 参数,它是一个错误对象。如果没有错误,则对象通过为空来指示。如果出现错误,则会填充不同的属性,例如“HasError”字段、“ErrorMessage”、“PrettyMessage”等。我现在尝试做的是创建不同类型的错误对象,它们都实现了错误我已经定义的接口。然后,我希望能够使 out 参数类似于“out IMyError 错误”,然后能够将该错误对象设置为该接口的一个实现,具体取决于我在方法中遇到的错误类型。我遇到的问题是序列化似乎不喜欢这样。该方法运行良好,但我没有 无法在客户端取回任何数据。这是一些希望澄清的代码。

我的界面

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,就像它在我尝试将其作为接口之前的工作方式一样。或者,如果发生不同的 IMyError 实现类,则返回格式为 json 的 THAT 类型。我认为它可以工作,因为它们都是 IMyError 类。

4

1 回答 1

3

您需要向客户端发送提示如何反序列化您的界面。WCF 使用KnownTypeAttribute.

您的服务应更改为如下所示:

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

您可以在 MSDN 中找到更多详细信息 - http://msdn.microsoft.com/en-us/library/ms730167.aspx

当然,您的客户应该有权访问具有类型的程序集AspError才能构造该类型。

于 2012-07-27T03:43:17.210 回答