.net core 试图配置多个.NET核心管道时,HttpContext最终为空

.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

我试图按照此指南在我的MVC应用程序中创建API部分和MVC部分之间的逻辑分离:

以下是我对他使用的扩展方法的实现:

    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.

对于任何第二次遇到此问题的人,我认为我有答案,但没有。对于任何第二次遇到此问题的人,我认为我有答案,但没有。嗨,你能帮我回答我的问题吗嗨,你能帮我回答我的问题吗