Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WCF中返回异常/故障的标准消息_C#_.net_Wcf_Exception Handling_Wcf Faults - Fatal编程技术网

C# 如何在WCF中返回异常/故障的标准消息

C# 如何在WCF中返回异常/故障的标准消息,c#,.net,wcf,exception-handling,wcf-faults,C#,.net,Wcf,Exception Handling,Wcf Faults,在我们的应用程序中,所有数据协定都有一个父级-OperationResponse,此OperationResponse包含枚举(属性Result中的枚举类型OperationState),它表示调用结果(Ok,InvalidParams,Error) 异常后如何覆盖WCF行为-不返回错误状态,但返回经典消息OperationResponse(在本例中为OperationResponse),但属性为Result=OperationState.Error 编辑:我想,我走对了路,我需要实现IErro

在我们的应用程序中,所有数据协定都有一个父级-
OperationResponse
,此
OperationResponse
包含枚举(属性
Result
中的枚举类型
OperationState
),它表示调用结果(Ok,InvalidParams,Error)

异常后如何覆盖WCF行为-不返回错误状态,但返回经典消息OperationResponse(在本例中为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:这似乎是一个无法解决的问题。。。我只发现同样的问题没有解决,比如…:(

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

在这里,我们创建了一个通用的
服务响应
,它可以在属性
数据
中包含任何类型的响应,并在
成功
状态消息
中包含状态信息

使用
CreateServiceResponse()

也许您可以调整此选项,以使用
OperationState
而不是此处使用的
successed
属性返回
OperationResponse
的实例

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.
    }
}
公共类服务响应
{
公共服务回应()
{
//初始默认值:
数据=默认值(T);
成功=真;
StatusMessage=string.Empty;
}
//指示尝试的操作是否已成功完成。
[数据成员]
公共布尔成功{get;set;}
//操作失败时的错误消息。
[数据成员]
公共字符串状态消息{get;set;}
//任何服务调用的主要结果。
[数据成员]
公共T数据{get;set;}
[数据成员]
公共字符串InnerExceptionMessage{get;set;}
公共静态ServiceResponse CreateServiceResponse(Func responseFunc)
{
var response=newservicereponse();
尝试
{
response.Data=responseFunc.Invoke();
}
捕获(例外情况除外)
{
响应=HandleException(responseFunc,ex);
}
返回响应;
}
专用静态ServiceResponse HandleException(Func responseFunc,异常示例)
{
//在此处处理任何异常,并返回带有
//succeed=false,以及相应的消息等。
}
}
用法示例(假设GetClient()将返回IEnumerable):

var response=servicesponse
.CreateServiceResponse(()=>GetClient(clientGroupId));

看看这些:,,,嘿,谢谢你的回复,实际上我们开发了类似的方法,所以我很高兴有人使用类似的方法,它向我表明,我们走在正确的道路上…:)很高兴能提供帮助!同样令人鼓舞的是,您达成了类似的解决方案。我们已经使用它一段时间了,它似乎工作得很好。
var response = ServiceResponse<IEnumerable<Client>>
                   .CreateServiceResponse(() => GetClients(clientGroupId));