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 IHttpContextAccessor
that is always non-zero (Win and Linux), but its property is HttpContext
always 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 build
followed by dotnet run
access 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 , .
- , , ?