asp.net-core – 如何将IHttpContextAccessor注入到Autofac TenantIdent
|
我正在将我的多租户应用程序从Webapi迁移到aspnet核心.在webapi版本中,我使用TenantIdentificationStrategy根据HttpContext上的请求路径识别租户. 转到aspnet核心,我能够成功连接autofac.我无法弄清楚如何连接租户策略.我尝试在ConfigureServices中注入IHttpContextAccessor services.AddSingleton<IHttpContextAccessor,HttpContextAccessor>(); 我的策略看起来像这样 public class AssetClassIdentificationStrategy: ITenantIdentificationStrategy {
private readonly IHttpContextAccessor _accessor;
public AssetClassIdentificationStrategy(IHttpContextAccessor httpContextAccessor)
{
_accessor = httpContextAccessor;
}
public bool TryIdentifyTenant(out object tenantId) {
tenantId = null;
var context = _accessor.HttpContext;
if (context != null && context.Request != null )){
var matchRegex = new Regex(@"/[d,.,w]*/(w*)/.*");
var match = matchRegex.Match(context.Request.Path.ToString());
if (match.Success) {
tenantId = match.Groups[1].Value.ToLower();
}
}
return tenantId != null;
}
}
我所看到的是正确地注入了HttpContextAccessor,其中HttpContext总是为null.因此,没有任何多租户服务得到解决. 查看样本,但找不到符合问题的任何内容.过去在Autofacv3中有一个RequestParameterTenantIdentificationStrategy,不再受支持.感谢任何帮助. 编辑 public class Startup
{
public Startup(IHostingEnvironment env) {
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json",optional: true,reloadOnChange: true);
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.Configure<CacheConfig>(Configuration.GetSection("Caching"),false);
services.AddMvc();
services.AddSingleton<IHttpContextAccessor,HttpContextAccessor>();
services.AddTransient<ITenantIdentificationStrategy,AssetClassIdentificationStrategy>();
var builder = new ContainerBuilder();
builder.Populate(services);
builder.RegisterType<TenantInfo>().WithProperty("TenantName","unknown").As<ITenantInfo>();
var container = builder.Build();
ITenantIdentificationStrategy tenantIdentificationStrategy;
bool isMultiTenant = container.TryResolve(out tenantIdentificationStrategy);
var mtc = new MultitenantContainer(tenantIdentificationStrategy,container);
mtc.ConfigureTenant("pesonalLoans",b => {
b.RegisterType<TenantInfo>().WithProperty("TenantName","pesonalLoans") .As<ITenantInfo>();
});
mtc.ConfigureTenant("retirement","retirement").As<ITenantInfo>();
});
return mtc.Resolve<IServiceProvider>();
}
public void Configure(IApplicationBuilder app,IHostingEnvironment env,ILoggerFactory loggerFactory)
{
LoggingConfig.Register(Configuration,loggerFactory);
app.UseMvc();
}
}
public class ValuesController : Controller {
private ITenantInfo _tenant;
public ValuesController(ITenantInfo tenant) {
_tenant = tenant;
}
[HttpGet]
public string Get()
{
return _tenant.TenantName;
}
}
public interface ITenantInfo {
string TenantName { get; set; }
}
public class TenantInfo: ITenantInfo
{
public string TenantName { get; set; }
}
编辑3 project.json {
"dependencies": {
"Microsoft.NETCore.App": {
"version": "1.0.0-rc2-3002702","type": "platform"
},"Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final","Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final","Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final","Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final","Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-rc2-final","Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final","Microsoft.Extensions.Logging": "1.0.0-rc2-final","Microsoft.Extensions.Logging.Console": "1.0.0-rc2-final","Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-final","Autofac": "4.0.0-rc2-240","Autofac.Multitenant": "4.0.0-beta8-219","System.IdentityModel.Tokens.Jwt": "5.0.0-rc2-305061149","Autofac.Extensions.DependencyInjection": "4.0.0-rc2-240","System.Reflection": "4.1.0-rc2-24027","System.Reflection.Primitives": "4.0.1-rc2-24027","System.Reflection.Extensions": "4.0.1-rc2-24027","System.Reflection.TypeExtensions": "4.1.0-rc2-24027","System.Reflection.Emit": "4.0.1-rc2-24027","System.Reflection.Context": "4.0.1-rc2-24027","System.Reflection.DispatchProxy": "4.0.1-rc2-24027","System.Reflection.Emit.ILGeneration": "4.0.1-rc2-24027","Microsoft.AspNetCore.Diagnostics": "1.0.0-rc2-final","Microsoft.AspNet.Mvc.Formatters.Xml": "6.0.0-rc1-final","Microsoft.AspNet.Mvc.Formatters.Json": "6.0.0-rc1-final",},"tools": {
"Microsoft.AspNetCore.Server.IISIntegration.Tools": {
"version": "1.0.0-preview1-final","imports": "portable-net45+win8+dnxcore50"
}
},"frameworks": {
"netcoreapp1.0": {
"imports": [
"dotnet5.6","dnxcore50","portable-net45+win8"
]
}
},"buildOptions": {
"emitEntryPoint": true,"preserveCompilationContext": true
},"runtimeOptions": {
"gcServer": true
},"scripts": {
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
}
解决方法目前还没有办法将内容注入租户识别策略,因为策略本身不会通过DI管道.IHttpContextAccessor通常只支持 var strat = new MyStrategy(new HttpContextAccessor()); 请注意,在最初询问问题时,多租户与ASP.NET Core IServiceProvider系统交互的方式存在问题,也就是说,它没有. 从那以后,我们发布了 更改是您需要更新ConfigureServices以返回新的AutofacServiceProvider(mtc);并且不再返回mtc.Resolve< IServiceProvider>();. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET中TextBox使用Ajax控件显示日期不全的问题解决方法
- ASP.NET主题样式表渲染
- asp.net-mvc – WebApi是否支持开箱即用的application / x-
- asp.net-mvc – 双值绑定问题
- asp.net – 如何将转发器中Item的客户端ID传递给javascript
- asp.net会员 – asp.net会员 – 设置注释字段
- 如何将组名应用于asp.net中的HTML单选按钮?
- asp.net-mvc-4 – 基于角色的导航
- 是否有WPF的母版页(如asp.net)的概念?
- asp.net-mvc-3 – ASP.Net MVC 3 Razor Concatenate String
- Autofac和ASP.NET Web API ApiController
- asp.net – 在另一个控件之前插入控件
- 如何在ASP.NET Membership Cookie中存储自定义数
- asp.net-mvc – 如何为所有控制器编写动作过滤器
- asp.net – 32位池和64位池之间的内存使用情况
- asp.net – ApplicationInstance.CompleteReques
- asp.net-mvc – Css和脚本不工作,直到用户登录网
- 从ASP.NET应用程序使用Active Directory时,Direc
- asp.net – 一个页面只能有一个服务器端表单标签
- asp.net-mvc – 如何覆盖Orchard CMS中导航区域的
