2017-11-08 3 views
4

私は.NET Core 2.0上で動作する単純なServiceStackプロジェクトを持っています。これはWindowsでは正常に動作しますが、Linuxでは失敗します。非常に同じコードで(下記参照)。HttpContextAccessor.HttpContextはLinuxではnullですが、ServiceStack.CoreのWindowsではnullではありません

サービスは、常にnull以外(ウィン&のLinux)であるが、その性質HttpContextは、常にWindows上でLinux上のヌルと常に非nullでIHttpContextAccessorを注入します。

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

プロジェクトは、Linux上で実行される方法について::いいえリバースプロキシ(nginxの等)、ちょうどdotnet builddotnet run続く、ローカルにアクセス

最小限のプロジェクトは、問題を再現します。何も幻想的ではありません。


勝利:Windowsの10エンタープライズ

のLinux:Ubuntuの16.04 LTS

DOTNETの--version:2.0.2(両方のプラットフォーム)


さらなる調査:

AppHost.ConfigureメソッドのIHttpContextAccessor登録にはa奇妙な効果:Windowsでは何も変わらず、すべてが期待どおりに機能します.Linuxでは、依存関係が満たされないため例外がスローされます。


誰も解決策、回避策、任意の情報を持っていますか?

答えて

4

これは私にとっては非常に奇妙ですが、修正方法はIHttpContextAccessorの登録方法です。これは間違いなく問題の核心を意味するものではありませんが、少なくとも私は物事を働かせています。

最後の文字までの同じコードが2つのプラットフォームで異なる動作をしていることは確かに問題です。

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

をしてStartup.ConfigureServices方法でIHttpContextAccessorを登録するには:

だから修正はAppHost.Configureに2つの行を削除することです

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

...そしてこれは私を修正します問題。

AppHost.ConfigureメソッドでHttpContextAccessorのインスタンスを取得する必要がある場合は、Startup.Configureメソッドでインスタンスを取得し、それをコンストラクタを介してAppHostインスタンスに挿入できます。検索はそうのように行われます。

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

すべてのすべてで、これは変だと私はWindows上ではなく、Linux上でそれを登録しないで逃げることができるので、それはどこかにバグのいくつかの種類が存在しなければなりません。

+2

.NETコアホストを構成するMS/.NETコアの依存関係は、登録する必要があります。NETコアパイプライン。この[IHttpContextAccessor 発表](https://github.com/aspnet/Hosting/issues/793)に登録例を示します。 – mythz

+2

部分的には、Linuxで動作しているときにはデフォルトでは登録されていませんが、Windowsで実行しているときにはデフォルトで登録されています。O –

+0

同じ問題があります。また、公式ASP.NETコアリポジトリでこの問題を提起しましたか? – metacircle

関連する問題