我是使用saaskit多租赁项目的多租户应用。
我能够创建租户上下文,并能够在所有控制器中访问。
然而,有时它会给我带来以下错误
出现了未处理的异常:无法解析“LMS.Model.AppTenant”类型的服务,同时试图激活“LMS.Controllers.OrganizationController”。
此错误随机发生在任何控制器和执行的任何操作方法上。错误的性质不特定于任何控制器/操作方法。
我可以看到我的代码成功地进入了TenantResolver,这实际上返回了一个租户,但是当DI将它注入到我的控制器时,它会用所列的错误来抱怨。
在此错误发生后,我的应用程序完全停止,并显示白色屏幕。
此问题发生在生产服务器上,而不是本地主机上。
对此有任何帮助!
在所有控制器中注入这样的租户
public class HomeController
{
public HomeController(TenantContext<AppTenant> tenantContext)
{
}
}下面是使tenantContext可注入的扩展类
public static class MultitenancyServiceCollectionExtensions
{
public static IServiceCollection AddMultitenancy<TTenant, TResolver>(this IServiceCollection services)
where TResolver : class, ITenantResolver<TTenant>
where TTenant : class
{
Ensure.Argument.NotNull(services, nameof(services));
services.AddScoped<ITenantResolver<TTenant>, TResolver>();
// Make Tenant and TenantContext injectable
services.AddScoped(prov =>
prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenant<TTenant>());
services.AddScoped(prov =>
prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenantContext<TTenant>());
// Ensure caching is available for caching resolvers
services.AddMemoryCache();
return services;
}
}对此有任何帮助,非常感谢!
发布于 2016-12-17 10:26:21
你不能/不应该那样做。问题在于你的登记:
// Make Tenant and TenantContext injectable
services.AddScoped(prov =>
prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenant<TTenant>());
services.AddScoped(prov =>
prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenantContext<TTenant>());他们两个都可以是null!当您注册一个依赖项时,它必须是--绝不是null!
例如,在这种情况下,您必须确保始终返回Tenant,如果没有租户信息,则返回一个泛型或未初始化的Tenant实例。你的TenantContext<AppTenant>也一样。它必须始终是非空的,但是租户可能不必包含有效的租户信息,也就是说,您可以在它上有一个IsValid属性来检查它是否是有效的租户。
当有人错误地输入包含租户的url部分或访问页面w/o (一个租户头)(或者不管您如何处理租户)时,您可能会有一个无效的租户。
有时或有时不会出现此问题的原因是,服务是每个请求(范围),因此,对于每个请求,它将再次尝试调用工厂方法,并且每次调用都会导致null。
https://stackoverflow.com/questions/41196529
复制相似问题