我正在使用 servicestack 并且遇到自动接线问题。
尝试解析服务“{Service}”或其自动装配的依赖项之一时出错(有关详细信息,请参阅内部异常)
我不需要帮助来弄清楚问题到底是什么。我真正想要的是一种查看内部异常的方法。内部异常应该告诉我异常问题,而无需我弄清楚,但它不会显示在返回的异常或日志中。
设置 DebugMode 也无济于事,它只包括最顶层异常的堆栈跟踪。
所以基本上,我如何阻止 servicestack 隐藏内部异常细节?
我正在使用 servicestack 并且遇到自动接线问题。
尝试解析服务“{Service}”或其自动装配的依赖项之一时出错(有关详细信息,请参阅内部异常)
我不需要帮助来弄清楚问题到底是什么。我真正想要的是一种查看内部异常的方法。内部异常应该告诉我异常问题,而无需我弄清楚,但它不会显示在返回的异常或日志中。
设置 DebugMode 也无济于事,它只包括最顶层异常的堆栈跟踪。
所以基本上,我如何阻止 servicestack 隐藏内部异常细节?
我遇到了同样的问题,结果是在我为特定端点类创建的构造函数内部抛出了一个异常。例子...
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,你可能会得到一个实际上有意义的异常。
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,你指的是什么异常被序列化还是代码中抛出的异常?
我有完全相同的例外。
就我而言,一旦迁移到 ServiceStack v4,就会发生这种情况。使用 v3,一切都可以完美运行。
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
一种选择可能是从Github获取实际源代码并将其作为项目添加到您的解决方案中,而不是使用已编译的 DLL,然后您可以单步执行实际代码并查看引发异常的确切位置和原因。