Как перехватить ошибки WCF и вернуть вместо них пользовательский ответ? - PullRequest
5 голосов
/ 10 июня 2011

Рассмотрим следующую очень базовую реализацию службы 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?Есть ли где-нибудь, где я могу подключиться?Могу ли я сделать это с каким-то атрибутом или чем-то?Пример того, как я хотел бы справиться с этим, можно продемонстрировать с помощью 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, я могу убедиться, что независимо от того, какое действие контроллера выдает исключение, я могуобработайте его и верните соответствующий формат ActionResult, содержащий необходимую информацию.Есть ли способ сделать это с WCF?

1 Ответ

7 голосов
/ 10 июня 2011

Ознакомьтесь с интерфейсом WCF IErrorHandler - он позволяет централизованно определить один из способов реализации службы для перехвата всех исключений и их проглатывания или преобразования в SOF-совместимые исключения SOAP.Это позволит убедиться, что канал между клиентом и сервером не поврежден, например, он все еще может использоваться после сбоя этого вызова.

Я не понимаю, почему вы хотите «поймать» SOAPошибки и преобразовать их во что-то еще, хотя .... и я не знаю никакой поддержки, которую WCF предоставил бы вам.Основное предположение: поймать исключения .NET и преобразовать их в совместимые ошибки SOAP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...