如何在 WCF 中 return exception/fault 上的标准消息
How to return standard message on exception/fault in WCF
在我们的应用程序中,所有数据合同都有一个父级 - OperationResponse
并且此 OperationResponse
包含枚举(属性 Result
中的枚举类型 OperationState
)代表调用结果(Ok, InvalidParams, Error).
如何在异常后覆盖 WCF 行为 - 不是 return 故障状态,而是 return 经典消息,在我的例子中是 OperationResponse,但 属性 结果 = 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...... :(
我不确定这是否正是您要查找的内容,但这是处理来自 WCF(可能还有其他 systems/contexts)的错误的一种相当易于管理的方法。
这里我们创建一个通用的ServiceResponse<T>
,它可以在属性Data
中包含任何类型的响应,在Succeeded
和StatusMessage
中包含状态信息].
使用 CreateServiceResponse()
对要在此对象中调用的方法进行排序。这样,您可以 return 一个 ServiceResponse
和 Data
设置为该方法的结果。底部有一个使用示例。
也许您可以将其调整为 return 您的 OperationResponse
的一个实例,使用 OperationState
而不是此处使用的 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() 将 return 一个 IEnumerable):
var response = ServiceResponse<IEnumerable<Client>>
.CreateServiceResponse(() => GetClients(clientGroupId));
在我们的应用程序中,所有数据合同都有一个父级 - OperationResponse
并且此 OperationResponse
包含枚举(属性 Result
中的枚举类型 OperationState
)代表调用结果(Ok, InvalidParams, Error).
如何在异常后覆盖 WCF 行为 - 不是 return 故障状态,而是 return 经典消息,在我的例子中是 OperationResponse,但 属性 结果 = 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...... :(
我不确定这是否正是您要查找的内容,但这是处理来自 WCF(可能还有其他 systems/contexts)的错误的一种相当易于管理的方法。
这里我们创建一个通用的ServiceResponse<T>
,它可以在属性Data
中包含任何类型的响应,在Succeeded
和StatusMessage
中包含状态信息].
使用 CreateServiceResponse()
对要在此对象中调用的方法进行排序。这样,您可以 return 一个 ServiceResponse
和 Data
设置为该方法的结果。底部有一个使用示例。
也许您可以将其调整为 return 您的 OperationResponse
的一个实例,使用 OperationState
而不是此处使用的 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() 将 return 一个 IEnumerable):
var response = ServiceResponse<IEnumerable<Client>>
.CreateServiceResponse(() => GetClients(clientGroupId));