gpt4 book ai didi

wcf - 如何拦截 WCF 错误并返回自定义响应?

转载 作者:行者123 更新时间:2023-12-04 18:14:35 25 4
gpt4 key购买 nike

考虑以下非常基本的 WCF 服务实现:

public enum TransactionStatus 
{
Success = 0,
Error = 1
}

public class TransactionResponse
{
public TransactionStatus Status { get; set; }
public string Message { get; set; }
}


[ServiceContract]
[XmlSerializerFormat]
public interface ITestService
{
[OperationContract]
TransactionResponse DoSomething(string data);
}

public class TestService : ITestService
{
public TransactionResponse DoSomething(string data)
{
var result = ProcessData(data); // may throw InvalidOperationException
return new TransactionResponse()
{
Status = TransactionStatus.Success,
Message = result
};
}

private string ProcessData(string data)
{
if (data = "foobar")
throw new InvalidOperationException();

return data;
}
}

在 DoSomething 方法确实抛出 InvalidOperationException 的情况下,我想拦截错误并返回 TransactionResponse 对象,而不是让 WCF 向客户端引发 FaultException。如果不在一个巨大的 try catch 语句中包围每个方法体,我怎么能做到这一点?有什么地方我可以 Hook 吗?我可以使用某种属性或其他东西来做到这一点吗?可以使用 ASP.NET MVC 演示我想如何处理它的示例:
public class ApiController : BaseController
{
protected override void OnException(ExceptionContext filterContext)
{
var ex = filterContext.Exception;
var message = HttpContext.IsDebuggingEnabled ? ex.ToString() : ex.Message;

_logger.Error("Error processing request for controller {0}, action {1}",
filterContext.RequestContext.RouteData.Values["controller"],
filterContext.RequestContext.RouteData.Values["action"]);

_logger.Error(ex.ToString());
filterContext.ExceptionHandled = true;
filterContext.Result = ToXml(new ApiResult(false)
{
Message = message
});
}

// ...
}

在 MVC 中使用上述方法,我可以确保无论哪个 Controller 操作引发异常,我都可以处理它并返回包含必要信息的适当格式的 ActionResult。有没有办法用 WCF 做这种事情?

最佳答案

查看 WCF IErrorHandler接口(interface) - 它允许您在服务实现中集中定义一种方法来捕获所有异常并吞下它们,或者将它们转换为 WCF 友好的 SOAP 异常。这将确保客户端和服务器之间的 channel 没有故障,例如此调用失败后仍可使用。

不过,我不明白您为什么要“捕获” SOAP 错误并将其转换为其他错误……我也不知道 WCF 会为您提供任何支持。基本假设是:捕获 .NET 异常并将它们转换为可互操作的 SOAP 错误

关于wcf - 如何拦截 WCF 错误并返回自定义响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6309154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com