- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将 Multi-Tenancy 应用程序从 Webapi 迁移到 aspnet core。在 webapi 版本中,我使用 TenantIdentificationStrategy
根据 HttpContext
上的请求路径识别租户。
转向 aspnet core,我能够成功连接 autofac。我无法弄清楚如何连接租户策略。我尝试在 ConfigureServices
中注入(inject) 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
被正确注入(inject),其中 HttpContext
始终为 null。因此,没有解决任何 Multi-Tenancy 服务问题。
四处寻找示例,但找不到任何适合该问题的内容。 Autofacv3 中曾经有一个 RequestParameterTenantIdentificationStrategy
,但不再受支持。感谢对此的任何帮助。
编辑修复了代码问题并根据要求添加 Startup.cs。
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", b => {
b.RegisterType<TenantInfo>().WithProperty("TenantName", "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; }
}
编辑3project.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%" ]
}
}
最佳答案
目前还没有办法将内容注入(inject)到租户识别策略中,因为该策略本身不经过 DI 管道。
IHttpContextAccessor
通常只支持 HttpContextAccessor
无论如何,它是一个单例,并通过从异步/线程本地上下文获取信息来进行操作。您可以在启动时直接使用其中一项来更新您的策略:
var strat = new MyStrategy(new HttpContextAccessor());
请注意,最初提出问题时, Multi-Tenancy 与 ASP.NET Core 交互的方式存在问题 IServiceProvider
系统,也就是说,它没有。
从那时起,我们发布了 4.0.0-rc3-309
for the Autofac.Extensions.DependencyInjection
package这解决了这个问题。
变化是您需要更新ConfigureServices
至return new AutofacServiceProvider(mtc);
并且不再这样做return mtc.Resolve<IServiceProvider>();
.
关于c# - 如何将 IHttpContextAccessor 注入(inject) Autofac TenantIdentificationStrategy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38111427/
我有一个使用 IHttpContextAccessor 获取 header 值的方法 public class HeaderConfiguration : IHeaderConfiguration {
我在尝试从 IHttpContextAccessor 字段获取 httpcontext 时遇到问题,该字段在类中始终为 null。 有我的startup.cs public void Configur
我正在尝试使用 .NET Core 运行时将 ASP.NET MVC 站点迁移到 ASP.NET Core。以前我们可以从 session 存储中获取对象,即使是在不同的程序集中,使用 var obj
我有静态助手类 public static class Current { public static string Host { get { return "http
这是一个asp.net核心项目。这是我的代码。 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .Ad
我正在尝试在静态类中创建通用 addReplaceCookie 方法。该方法看起来像这样 public static void addReplaceCookie(string cookieName,
在我见过的所有 IHttpContextAccessor 注入(inject)示例中,它都被设置为 Singleton。 例子: How to add IHttpContextAccessor in
我在 .NET 6 Core 中创建了自定义授权策略。它可以很好地满足我的要求,但是我在调试时发现错误 - 尚未为此应用程序或请求配置 session 。但是我已经在我的 program.cs 中
David Fowler 和 Damian Edwards 最近在伦敦 NDC 发表了关于调试 asp.net core 2.0 的演讲。 In that talk ,他们会警告执行异步操作的 Con
当我尝试从 IHttpContextAccessor 字段始终为空获取 httpcontext 时遇到问题。 这是我的startup.cs public void ConfigureServi
我正在将 Multi-Tenancy 应用程序从 Webapi 迁移到 aspnet core。在 webapi 版本中,我使用 TenantIdentificationStrategy 根据 Htt
我一直在模拟 IHttpContextAccessor 以进行一些 Web API 集成测试。我的目标是能够模拟 IHttpContextAccessor 并返回 NameIdentifier 声明和
我正在尝试使用 Jason Taylor's Clean Architecture Template ,这个模板使用NSwag自动创建了一个TypeScript Client(Angular),但是我
目标:将 IHttpContextAccessor 作为依赖注入(inject)到 autmapper 配置文件的构造函数中 原因:我需要传入当前用户的身份名称作为构建我的域对象之一的一部分 问题获取
在启动文件中,我试图在构造函数本身中注入(inject) IHttpContextAccessor。 在本地运行 API 时,IHttpContextAccessor 成功注入(inject)到启动类
.NET Core 2.2 成功登录后,HttpContext.User.Claims 和 IHttpContextAccessor 均返回空值这是我的启动服务, services.AddDbCo
我想尝试一下使用 Blazor 服务器端,到目前为止,我已经设法以某种方式克服了大多数令人头疼的问题,并且很享受它,直到现在。 我正在尝试为 Google Recaptcha v3 编写一个验证器,它
我有一个 Controller 操作方法: public void Register([FromBody]RegisterTenantCommand message) { ... } 我有 R
我开始将我的 asp.net core RC1 项目转换为 RC2 并面临现在的问题 IHttpContextAccessor没有解决。 为了简单起见,我使用 Visual Studio 模板 ASP
我想设置一个服务,将当前的 HttpContext 注入(inject)到我项目的一个类中,以便它可以管理 cookie。 我在我的 Startup.cs 类中这样设置服务: public void
我是一名优秀的程序员,十分优秀!