1

我正在使用 servicestack 并且遇到自动接线问题。

尝试解析服务“{Service}”或其自动装配的依赖项之一时出错(有关详细信息,请参阅内部异常)

我不需要帮助来弄清楚问题到底是什么。我真正想要的是一种查看内部异常的方法。内部异常应该告诉我异常问题,而无需我弄清楚,但它不会显示在返回的异常或日志中。

设置 DebugMode 也无济于事,它只包括最顶层异常的堆栈跟踪。

所以基本上,我如何阻止 servicestack 隐藏内部异常细节?

4

4 回答 4

3

我遇到了同样的问题,结果是在我为特定端点类创建的构造函数内部抛出了一个异常。例子...

public class PartnerService : Service
{

    private PartnerManagementService _partnerManagementService;

    public PartnerService()
    {
        var configuration = new Configuration();
        _partnerManagementService = new PartnerManagementService(configuration);
    }

    public object Get(PartnerGet partner)
    {

        try
        {
            var partners = _partnerManagementService.getPartners();

            if (!partners.Any())
            {
                return new HttpError(HttpStatusCode.NotFound, "Partners Could not be found");
            }

            return partners;
        }
        catch (Exception e)
        {

            return new HttpError(HttpStatusCode.InternalServerError, e);
        }
    }

如果发生在构造函数内部抛出异常,ServiceStack 将无法解析服务或其依赖项之一,在这种情况下,该依赖项是类的构造函数。

如果你在类的构造函数中放置一个 try/catch,你可能会得到一个实际上有意义的异常。

于 2014-03-25T20:48:10.487 回答
2

ServiceStack 应该已经返回内部异常,即这里是错误的来源

private Exception CreateResolveException<TService>(Exception ex)
{
    var errMsg = "Error trying to resolve Service '{0}' or one of its autowired dependencies (see inner exception for details).".Fmt(typeof(TService).FullName);
    return new Exception(errMsg, ex);
}

基本上,您的 IOC 配置存在问题,并且其中一个依赖项导致了错误。

您可以更改 ServiceStack 以序列化内部异常:

SetConfig(new EndpointHostConfig {
    ReturnsInnerException = true,
});

但这已经默认为 true。

所以异常应该已经包含了Inner Exception,你指的是什么异常被序列化还是代码中抛出的异常?

于 2013-10-09T16:06:25.740 回答
0

我有完全相同的例外。

就我而言,一旦迁移到 ServiceStack v4,就会发生这种情况。使用 v3,一切都可以完美运行。

IOC 配置

public class AppHost : AppHostBase
{
    public AppHost() : base("Northwind web services", typeof(CustomersService).Assembly)
    { }        


    public override void Configure( Container container )
    {
        SetConfig(new HostConfig
        {
            DebugMode = true,
            ReturnsInnerException = true,
        });         

        var dbFactory = new OrmLiteConnectionFactory("~/Northwind.sqlite".MapHostAbsolutePath(), SqliteDialect.Provider);

        container.Register(dbFactory);

        // Dependencies
        container.RegisterAs<CustomerEntityRepository, ICustomerEntityRepository>();

        container.RegisterAutoWired<CustomersService>();

    }
}

基类

public abstract class Repository<TEntity> : IRepository<TEntity> where TEntity : IEntity, new()
{        

    protected IDbConnectionFactory dbFactory { get; set; }

    public Repository( IDbConnectionFactory factory )
    {
        dbFactory = factory;
    }
}

继承类

public class CustomerEntityRepository : Repository<CustomerEntity>, ICustomerEntityRepository
    {
        public CustomerEntityRepository( IDbConnectionFactory dbFactory )
            : base(dbFactory)
        {
        }
    }
}

我找到的唯一解决方案是:

container.RegisterAs<ICustomerEntityRepository>(c => new CustomerEntityRepository(dbFactury));

这是返回的完整异常消息http://pastebin.com/jJntNN5p

于 2014-04-11T12:56:06.140 回答
0

一种选择可能是从Github获取实际源代码并将其作为项目添加到您的解决方案中,而不是使用已编译的 DLL,然后您可以单步执行实际代码并查看引发异常的确切位置和原因。

于 2013-10-09T09:24:01.557 回答