HttpContextAccessor.HttpContext is null for Linux, but not null for Windows in ServiceStack.Core

I have a simple ServiceStack project that runs on .NET Core 2.0. This works fine on Windows, but does not work on Linux. With the same code (see below).

A service receives an injection IHttpContextAccessorthat is always non-zero (Win and Linux), but its property is HttpContextalways zero for Linux and always non-null on Windows.

Minimal design to reproduce the problem:

using Funq;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using ServiceStack;

namespace TestSS
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services) { }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseDeveloperExceptionPage();
            app.UseServiceStack(new AppHost());
        }
    }

    public class AppHost : AppHostBase
    {
        public AppHost() : base("AO", typeof(InfoService).Assembly) { }

        public override void Configure(Container container)
        {
            var httpContextAccessor = new HttpContextAccessor();
            container.Register<IHttpContextAccessor>(httpContextAccessor);
        }
    }

    public class InfoService : Service
    {
        [Route("/info")] public class InfoRequest { }

        private readonly IHttpContextAccessor _accessor;

        public InfoService(IHttpContextAccessor accessor)
        {
            _accessor = accessor;
        }

        public object Any(InfoRequest request)
        {
            return $"Accessor: {_accessor};\nContext: {_accessor.HttpContext};";
        }
    }
}

Regarding how the project is launched on Linux: there is no reverse proxy (nginx, etc.), just dotnet buildfollowed by dotnet runaccess to it locally. Nothing unusual, nothing confused IMHO.


Win: Windows 10 Enterprise

Linux: Ubuntu 16.04 LTS

dotnet --version: 2.0.2 ( )


:

IHttpContextAccessor AppHost.Configure : Windows , , , Linux , .


- , , ?

+4
1

( ), , , , IHttpContextAccessor. , โ€‹โ€‹, , , .

, , , , - .

, AppHost.Configure:

var httpContextAccessor = new HttpContextAccessor();
container.Register<IHttpContextAccessor>(httpContextAccessor);

IHttpContextAccessor Startup.ConfigureServices:

services.AddSingleton<IHttpContextAccessor>(new HttpContextAccessor());

... .

, , HttpContextAccessor AppHost.Configure, Startup.Configure AppHost. :

var httpContextAccessor = (IHttpContextAccessor)app.ApplicationServices.GetService(typeof(IHttpContextAccessor));

, , - -, Windows, Linux.

+4

Source: https://habr.com/ru/post/1688970/


All Articles