2017-11-08 17 views
4

.NET Framework 2.0에서 실행되는 간단한 ServiceStack 프로젝트가 있습니다. 이것은 Windows에서 잘 작동하지만 Linux에서는 실패합니다. 매우 동일한 코드 (아래 참조).HttpContextAccessor.HttpContext는 Linux에서는 null이고 Windows에서는 ServiceStack.Core가 아닌 null입니다.

서비스는 항상 null이 아니며 (& 리눅스) IHttpContextAccessor으로 주입되지만 그 속성 인 HttpContext은 Linux에서는 항상 null이고 Windows에서는 항상 null이 아닙니다.

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};"; 
     } 
    } 
} 

프로젝트가 리눅스에서 실행하는 방법에 관한 : 없음 리버스 프록시 (의 nginx 등), 단지 dotnet builddotnet run 다음, 로컬 액세스

최소 프로젝트는 문제를 재현합니다. 공상적이고 아무것도 IMHO가 아닙니다.


승리 : 윈도우 10 기업

리눅스 : 우분투 16.04 LTS

후에 .NET --version : 2.0.2 (두 플랫폼)


추가 조사 :

AppHost.Configure 메서드의 IHttpContextAccessor 등록에 대한 설명은 다음과 같습니다. 이상한 효과 : Windows에서 아무것도 변경되지 않고 모든 것이 예상대로 작동하지만 Linux에서는 종속성을 충족시킬 수 없기 때문에 예외가 발생합니다.


해결 방법, 해결 방법, 모든 정보가 있습니까?

답변

4

이것은 매우 이상합니다 (나에게). 그러나 수정 방법은 IHttpContextAccessor입니다. 이것은 분명히 이슈의 핵심이지만, 최소한 나는 일을해야한다는 것을 의미하지는 않습니다.

마지막 문자까지 아주 동일한 코드가 두 플랫폼에서 다르게 작동하는 것은 분명히 문제입니다.

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

을하고 Startup.ConfigureServices 방법에 IHttpContextAccessor를 등록 :

그래서 수정은 AppHost.Configure에 두 줄을 삭제하는 것입니다

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

... 이것은 내를 해결 발행물.

당신은 AppHost 인스턴스로, 생성자 경유하여 AppHost.Configure 방법 당신은 Startup.Configure 방법의 인스턴스를 검색하고 삽입 할 수있는 HttpContextAccessor의 인스턴스를 가지고, 나처럼, 필요한 경우. 검색은과 같이 수행됩니다

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

모두 모두,이 이상하고 내가 Windows에서가 아니라 리눅스에 등록하지 멀리 얻을 수 있기 때문에 어딘가에 버그의 일종이 있어야합니다.

+2

.NET 핵심 호스트를 구성하는 모든 MS/.NET 핵심 종속성은에 등록해야합니다.NET 코어 파이프 라인. 이 [IHttpContextAccessor 발표] (https://github.com/aspnet/Hosting/issues/793)에는 등록 예제가 나와 있습니다. – mythz

+2

부분적으로 사실이지만 Linux에서 실행될 때 기본적으로 등록되지 않지만 Windows에서 실행할 때 기본적으로 등록됩니다. O –

+0

동일한 문제가 있습니다. 공식 ASP.NET 코어 저장소에서도이 문제를 제기 했습니까? – metacircle