.net core 试图配置多个.NET核心管道时,HttpContext最终为空
我试图按照此指南在我的MVC应用程序中创建API部分和MVC部分之间的逻辑分离: 以下是我对他使用的扩展方法的实现:.net core 试图配置多个.NET核心管道时,HttpContext最终为空,.net-core,asp.net-core-mvc,.net Core,Asp.net Core Mvc,我试图按照此指南在我的MVC应用程序中创建API部分和MVC部分之间的逻辑分离: 以下是我对他使用的扩展方法的实现: public static IApplicationBuilder UseBranchWithServices(this IApplicationBuilder app, PathString path, Action<IServiceCollection> servicesConfiguration, Action<I
public static IApplicationBuilder UseBranchWithServices(this IApplicationBuilder app,
PathString path, Action<IServiceCollection> servicesConfiguration,
Action<IApplicationBuilder> appBuilderConfiguration)
{
var webhost = new WebHostBuilder()
.UseKestrel()
.ConfigureServices(servicesConfiguration)
.UseStartup<StartupHarness>()
.Build()
/* ojO */ .CreateOrMigrateDatabase(); /* Ojo */
var serviceProvider = webhost.Services;
var featureCollection = webhost.ServerFeatures;
var appFactory = serviceProvider.GetRequiredService<IApplicationBuilderFactory>();
var branchBuilder = appFactory.CreateBuilder(featureCollection);
var factory = serviceProvider.GetRequiredService<IServiceScopeFactory>();
branchBuilder.Use(async (context, next) => {
using (var scope = factory.CreateScope()) {
context.RequestServices = scope.ServiceProvider;
await next();
}
});
appBuilderConfiguration(branchBuilder);
var branchDelegate = branchBuilder.Build();
return app.Map(path, builder => { builder.Use(async (context, next) => {
await branchDelegate(context);
});
});
}
这并不是:
public void Configure(IApplicationBuilder builder, IHostingEnvironment env)
{
builder.UseBranchWithServices(StaticConfiguration.RootPath,
services =>
{
services.ConfigureMvcServices(Configuration);
},
app => { app.ConfigureMvcBuilder(env); }
);
builder
.Run(async c =>
await c.Response.WriteAsync("This should work"));
}
在后一个示例中,services
对象以335个描述符的Count
结束,在前一个(工作)示例中,它有356个描述符
我试着看了看,看我是否能弄清楚到底发生了什么,但我看不出方法中的内容与Gordon描述的内容之间有很强的相关性。所以我完全迷路了。任何帮助都将不胜感激。如果有一种方法可以拆分扩展方法,并为每个管道传递服务,那么我就可以这样做
是的,我知道你在这里只看到一条管道。关键是要添加更多内容。以下是我的结论: 这是解决这个问题的错误方法。我需要一个正确配置的管道。我将API和Web项目合并到一个项目中(尽管这可能无关紧要,只要所有内容都已注册) (出于其他原因,我添加了async。与此无关。) Program.cs:
public static async Task Main(string[] args)
{
IWebHost webhost = CreateWebHostBuilder(args).Build();
await webhost.CreateOrMigrateDatabase();
await webhost.RunAsync();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
new WebHostBuilder()
.ConfigureAppConfiguration((host, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile("appsettings.json");
if (host.HostingEnvironment.IsDevelopment())
config.AddUserSecrets<Startup>();
else
config.AddEnvironmentVariables(prefix: "MYAPP_");
})
.UseKestrel()
.ConfigureLogging((app, logging) =>
{
//snip
})
.UseStartup<Startup>()
.UseUrls("http://*:4213");
}
公共静态异步任务主(字符串[]args)
{
IWebHost webhost=CreateWebHostBuilder(args.Build();
等待webhost.CreateOrMigrateDatabase();
等待webhost.RunAsync();
}
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
新WebHostBuilder()
.ConfigureAppConfiguration((主机,配置)=>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile(“appsettings.json”);
if(host.HostingEnvironment.IsDevelopment())
config.AddUserSecrets();
其他的
config.AddEnvironmentVariables(前缀:“MYAPP_”);
})
.UseKestrel()
.ConfigureLogging((应用程序,日志)=>
{
//剪断
})
.UseStartup()
.useURL(“http://*:4213”);
}
Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
var connString = Configuration.GetConnectionString("default");
services.ConfigureJwt(_signingKey, Configuration);
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2#configure-localization
services.AddLocalization(options => options.ResourcesPath = StartupConfiguration.ResourcesFolder);
services.AddDbContext<AppDbContext>(builder =>
{
builder.UseLazyLoadingProxies()
.UseSqlServer(connString, with => with.MigrationsAssembly("App.Data"));
});
services.ConfigureAuthentication(Configuration);
var mapperConfig = new MapperConfiguration(maps =>
{
maps.ConfigureMvc();
maps.ConfigureApi();
});
var mapper = mapperConfig.CreateMapper();
services.AddSingleton(mapper);
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2#configure-localization
services.AddMvc() // (config => { config.Filters.Add(new AuthorizeFilter()); }) // <~ for JWT auth
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSpaStaticFiles(angularApp =>
{
angularApp.RootPath = "dist"; // TODO
});
//snip
}
public void配置服务(IServiceCollection服务)
{
var connString=Configuration.GetConnectionString(“默认”);
services.ConfigureJwt(_signingKey,Configuration);
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2#配置本地化
services.AddLocalization(options=>options.ResourcesPath=StartupConfiguration.ResourcesFolder);
services.AddDbContext.以下是我的结论:
这是解决此问题的错误方法。我需要一个正确配置的管道。我将API和Web项目组合到一个项目中(尽管这可能不重要,只要所有内容都已注册)
(出于其他原因,我添加了async。与此无关。)
Program.cs:
public static async Task Main(string[] args)
{
IWebHost webhost = CreateWebHostBuilder(args).Build();
await webhost.CreateOrMigrateDatabase();
await webhost.RunAsync();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
new WebHostBuilder()
.ConfigureAppConfiguration((host, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile("appsettings.json");
if (host.HostingEnvironment.IsDevelopment())
config.AddUserSecrets<Startup>();
else
config.AddEnvironmentVariables(prefix: "MYAPP_");
})
.UseKestrel()
.ConfigureLogging((app, logging) =>
{
//snip
})
.UseStartup<Startup>()
.UseUrls("http://*:4213");
}
公共静态异步任务主(字符串[]args)
{
IWebHost webhost=CreateWebHostBuilder(args.Build();
等待webhost.CreateOrMigrateDatabase();
等待webhost.RunAsync();
}
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
新WebHostBuilder()
.ConfigureAppConfiguration((主机,配置)=>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile(“appsettings.json”);
if(host.HostingEnvironment.IsDevelopment())
config.AddUserSecrets();
其他的
config.AddEnvironmentVariables(前缀:“MYAPP_”);
})
.UseKestrel()
.ConfigureLogging((应用程序,日志)=>
{
//剪断
})
.UseStartup()
.useURL(“http://*:4213”);
}
Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
var connString = Configuration.GetConnectionString("default");
services.ConfigureJwt(_signingKey, Configuration);
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2#configure-localization
services.AddLocalization(options => options.ResourcesPath = StartupConfiguration.ResourcesFolder);
services.AddDbContext<AppDbContext>(builder =>
{
builder.UseLazyLoadingProxies()
.UseSqlServer(connString, with => with.MigrationsAssembly("App.Data"));
});
services.ConfigureAuthentication(Configuration);
var mapperConfig = new MapperConfiguration(maps =>
{
maps.ConfigureMvc();
maps.ConfigureApi();
});
var mapper = mapperConfig.CreateMapper();
services.AddSingleton(mapper);
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2#configure-localization
services.AddMvc() // (config => { config.Filters.Add(new AuthorizeFilter()); }) // <~ for JWT auth
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSpaStaticFiles(angularApp =>
{
angularApp.RootPath = "dist"; // TODO
});
//snip
}
public void配置服务(IServiceCollection服务)
{
var connString=Configuration.GetConnectionString(“默认”);
services.ConfigureJwt(_signingKey,Configuration);
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2#配置本地化
services.AddLocalization(options=>options.ResourcesPath=StartupConfiguration.ResourcesFolder);
services.AddDbContext.对于任何第二次遇到此问题的人,我认为我有答案,但没有。对于任何第二次遇到此问题的人,我认为我有答案,但没有。嗨,你能帮我回答我的问题吗嗨,你能帮我回答我的问题吗