【问题标题】:How to return standard message on exception/fault in WCF如何在 WCF 中返回有关异常/故障的标准消息
【发布时间】:2015-04-20 14:17:45
【问题描述】:

在我们的应用程序中,所有数据合约都有一个父级 - OperationResponse,而这个OperationResponse 包含枚举(属性Result 中的枚举类型OperationState),它代表调用结果(Ok,InvalidParams,错误)。

如何在异常后覆盖 WCF 行为 - 不返回故障状态,但返回经典消息 OperationResponse 在我的情况下,但属性 Result = OperationState.Error?

编辑: 我想,我走对了,我需要实现 IErrorHandler,但现在我迷路了,因为我不知道如何将错误消息设置为传出的错误消息...

public bool HandleError(Exception error)
{
    // log error
    return true; // we catch error and provide our custom message.
}

public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
    // create result message
    var message = new OperationResponse
    {
        Result = OperationState.Error
    };

    // ok how to return message into ref fault?
}

Edit2: 似乎没有解决方案是无法破解的问题...我只发现了没有解决方案的相同问题,例如this thread... :(

【问题讨论】:

标签: c# .net wcf exception-handling wcf-faults


【解决方案1】:

我不确定这是否正是您要寻找的,但它是一种相当易于管理的方式来处理来自 WCF(可能还有其他系统/上下文)的错误。

这里我们创建一个通用的ServiceResponse<T>,它可以在属性Data中包含任何类型的响应,在Succeeded和StatusMessage中包含状态信息。

使用CreateServiceResponse() 来包装您想要在此对象中调用的任何方法。这样,您可以返回一个 ServiceResponse 并将 Data 设置为该方法的结果。底部有一个使用示例。

也许您可以调整它以返回带有OperationState 的OperationResponse 实例,而不是此处使用的Succeeded 属性?

public class ServiceResponse<T>
{
    public ServiceResponse()
    {
        // Initial default values:
        Data = default(T);
        Succeeded = true;
        StatusMessage = string.Empty;
    }

    // Indicates whether the attempted operation was completed successfully. 
    [DataMember]
    public bool Succeeded { get; set; }

    // Error messages if an operation fails.
    [DataMember]
    public string StatusMessage { get; set; }

    // The main results from any service-call.        
    [DataMember]
    public T Data { get; set; }

    [DataMember]
    public String InnerExceptionMessage { get; set; }

    public static ServiceResponse<T> CreateServiceResponse(Func<T> responseFunc)
    {
        var response = new ServiceResponse<T>();

        try
        {
            response.Data = responseFunc.Invoke();
        }
        catch (Exception ex)
        {
            response = HandleException(responseFunc, ex);
        }

        return response;
    }

    private static ServiceResponse<T> HandleException(Func<T> responseFunc, Exception ex)
    {
        // Handle any exceptions here, and return a ServiceResponse with 
        // Succeeded = false, and the appropriate messages, etc.
    }
}

使用示例(假设 GetClients() 将返回一个 IEnumerable):

var response = ServiceResponse<IEnumerable<Client>>
                   .CreateServiceResponse(() => GetClients(clientGroupId));

【讨论】:

  • 嘿,谢谢你的回复,实际上我们开发了类似的方法,所以我很高兴有人使用类似的方法,它告诉我,我们走在正确的道路上...... :)
  • 很高兴能帮上忙!同样令人鼓舞的是,您达成了类似的解决方案。我们已经使用它一段时间了,它似乎工作得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2014-05-29
  • 2014-09-22
  • 1970-01-01
相关资源
最近更新 更多