2016-08-10 9 views
3

AspNet CoreのHttpContextをコントローラ外に取得する必要があります。古いAspNet 4では、HttpContext.Currentを使用して取得できましたが、新しいAspNetでは削除されているようです。コントローラ外のAspNet Core 1.0.0でHttpContextを取得

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
} 

私はそれを研究し、これは:私が見つけた唯一の回避策は、依存性注入によってIHttpContextAccessorを解決し、それにのHttpContextを求めて、私はアプリケーションの起動中にシングルトンとしてIHttpContextAccessorを追加する必要がありIHttpContextAccessorを注入することです私が見つけた唯一の方法。私はそれをGoogleとIHttpContextAccessorは非常に依存性が高いので、依存関係リゾルバのデフォルトとして削除されました。これを達成する他の方法はありますか?

編集: 代わりに依存リゾルバにシングルトンとしてそれを追加するので、私は私自身のシングルトンクラスでそれを保存するために、同じ場所でHttpContextAccessorのインスタンスを得ることができるのだろうか?

+0

'HttpContext'をクラスで取得する必要がある場合、' IHttpContextAccessor'を使って何が問題になりますか?あなたのコードはうまくいく(コンストラクタインジェクションを使うだけで)。 –

+0

しかし、それが機能するためには、IHttpContextAccessorを依存関係として追加する必要があります。私はその同じ場所でインスタンスを直接取得できないのだろうか?私は質問を編集します。 – yosbel

+0

@ademcaglinそれで、それを達成する方法であるようです。さて、サービスに追加してDIで取得する代わりに、インスタンスを直接取得することは可能ですか?私がDIにそれを加えることができれば、同じ場所でそれを得ることができるはずです。それは...ですか? – yosbel

答えて

5

従来のアプリケーションをASP.Net Coreにかなり複雑なものに移植する場合は、.Net Core DIシステムで正しく動作するように完全にリエンジニアリングする必要があります。これをしたくない場合は、サービスロケータでこの機能を再びグローバルにすることで、「不正行為」することができます。 (あなたはそれを避けることができる場合に推奨されていない)これを行うには:

public class RequestContextManager 
{ 
    public static RequestContextManager Instance { get; set; } 

    static RequestContextManager() 
    { 
    Instance = new RequestContextManager(null); 
    } 

    private readonly IHttpContextAccessor contextAccessor; 

    public RequestContextManager(IHttpContextAccessor contextAccessor) 
    { 
    this.contextAccessor = contextAccessor; 
    } 

    public HttpContext CurrentContext 
    { 
    get 
    { 
     if (contextAccessor == null) 
     return null; 
     return contextAccessor.HttpContext; 
    } 
    } 
} 

// In Startup.cs 
public void Configure(IApplicationBuilder app,...) 
{ 
    ... 
    RequestContextManager.Instance = new RequestContextManager(app.ApplicationServices.GetService<IHttpContextAccessor>()); 
    ... 
} 

// In your code 
var httpContext = RequestContextManager.Instance.CurrentContext; 
+0

これは解決しようとしているのと同じ問題があり、IHttpContextAccessorをシングルトンとして追加していません。追加しないと、コードは最新のAspNetコアで例外をスローします。 – yosbel

+1

コード行を追加して依存関係として追加したくない特別な理由はありますか?あなたが上記の作業を行う場合 –

+0

私はちょうどそれが可能かどうか、別の方法がある場合は知ってほしい、私はそれがデフォルトとして削除された理由を明確にしていないとはなぜコントローラがHttpContext、この行を追加すると、コントローラはそれをどのように解決しますか?しかし、それが唯一の方法なら... :) – yosbel

2

HttpContextを有効にするには、クラスを呼び出すプログラムフローがコントローラまたはミドルウェアコンポーネントから発生している必要があります。 HttpContextへの参照をあなたのクラスに渡すことができます。

2

は直接、このGitHub Announcementは、それがIHttpContextAccessorで追跡のHttpContextの状態を維持するために非自明だと述べている理由の質問に答えるために。それで、それは必要に応じて移動されました。ただし、HttpContextはコントローラ内で使用できますが、これは注入されません。

私はあなたがプロジェクトレベルに依存しているとは思っていません。依存関係注入を介してクラスに入ったり、必要に応じてIServiceProviderから取得したりします。

関連する問題