ServiceStack IService<>错误处理

时间:2012-11-22 16:50:04

标签: c# web-services servicestack nlog

我们已成功实施ServiceStack IService<>接口并让它与iPhone通信,但我们不确定实现异常处理和记录的最佳方式。

public class AddCarService : IService<AddCar> 
{

    public UnitOfWork UnitOfWork { get; set; }

    public object Execute(AddCar request)
    {
        try
        {
            PersonBo person;
            if (UnitOfWork.PersonService.ValidateSession(request.SessionGuid, out person))
            {
                var car = new CarBo
                {
                    PersonId = person.PersonId,
                    Name = request.Car.Name,
                    RegistrationNumber = request.Car.RegistrationNumber,
                    IsActive = true,
                    IsDeleted = false
                };
                UnitOfWork.CarService.Add(car);
                var cars = UnitOfWork.CarService.GetCarByPersonId(person.PersonId);
                var mobileCars = cars.Select(carBo => new Car { CarId = carBo.CarId, Name = carBo.Name, RegistrationNumber = carBo.RegistrationNumber }).ToList();
                return new GetCarResponse { Cars = mobileCars, Status = ResponseStatus.Ok };
            }
            return new GetCarResponse { Cars = null, Status = ResponseStatus.Unauthorised };
        }
        catch (Exception ex)
        {
            UnitOfWork.Logging.Error("AddCarService", ex);
            return new GetCarResponse { Cars = null, Status = ResponseStatus.Exception };
        }
    }
}

添加一个try / catch会有相当大的性能损失,所以我们想知道ServiceStack框架中是否有一个函数构建来支持我们想要实现的目标,并且仍然会向iPhone返回一个格式良好的响应。

2 个答案:

答案 0 :(得分:1)

如果您继承ServiceBase<T>而不是实施IService<T>,则可以免费获得此功能(返回格式良好的回复),但如果您查看ServiceBase<T> class,您会看到这是通过将代码包装在try-catch块中完成的。

我认为你不会从ServiceStack获得更多。

答案 1 :(得分:1)

如果您使用的是ServiceStack's New API,则可以通过实施自己的ServiceRunner来一般性地处理异常。使用旧API,您需要在继承自HandleException()ServiceBase<T>的自定义基类中覆盖RestServiceBase<T>

请参阅此previous answer for more details