2016-04-22 4 views
2

私は簡単に、我々はMVCプロジェクト外のアセンブリで実行しているクエリの多くのユーザ名をつかむことができるようにする必要があります。私はすべての呼び出しにパラメータを追加するだけですが、文字通り数百もあります。同時アクセス

私の同僚は、(おそらくOnApplicationStartedまたはそのような何かで)のHttpContextへの静的参照を渡し、そこからユーザ名を取得するために私に助言しています。

のHttpContext常に現在のユーザーのセッションに関する情報を持っています。私の懸念事項は、(別のアセンブリに存在する)オブジェクトが、どのユーザーから情報を取得するのかを正確に知ることができず、単一のユーザーにはうまくいくかもしれないが、間違ったユーザー名をユーザーはシステムへのアクセスを開始します。

これは、ユーザ名を特定する実行可能な方法ですか?

はどのようにのHttpContextは、現在のユーザーであるユーザーを知っていますか?そのメカニズムはプロジェクト外で切断されていますか?

+0

あなたが外でライブラリ内のセッションを使用することができるならば、あなたはセッション中にユーザー名を入れて、そこからアクセスする必要があります。すべては、セッションからユーザー名情報を取得することを意味します。 –

+0

@AnkushJain:あなたがそれがうまくいくと思います。私が恐れているのは、静的なオブジェクト(つまり、すべてのユーザーに対して1つだけ)であるためです。ユーザー名をプルすると、それは他のユーザーになる可能性があります。 – micahhoover

+0

私は静的変数を作成するつもりはありません。私はセッション変数を使用するように求めています。セッションは常にユーザー固有のものです。 –

答えて

2

HttpContextインスタンスは、グローバルではありません - それは、特定の要求のコンテキストです。したがって、たとえば、あなたは、コントローラのアクションを実行している場合、あなたは、あなたがその要求のコンテキストを扱っている(つまり、Controller.HttpContextです)HttpContextを呼び出します。つまり、どのユーザーがコンテキストを要求しているのかという疑問はありません。その要求を開始したユーザーのためのものです。

あなたはOnApplicationStartedからそれを参照したいとは思わないでしょう。これは利用できないか、現在のリクエストのコンテキストになります。言われていること

、何が必要なのユーザー名であるならば、私はあなたが全体のHttpContextを渡したいと思います理由はわかりません。関数は、必要なパラメータのみを受け取る必要があります。ユーザー名が必要な場合はHttpContext.User.Identity.Nameから取得できます。そうすれば、他のライブラリを簡単にテストすることができます。また、他のライブラリが呼び出されても、Webアプリケーションから呼び出されない場合はどうなりますか?その後、それにはHttpContextが渡されません。私の同僚はとても似のSystem.Webを参照するために私に助言

0

他の人が行くここで、この非常に事を示唆されたが、かどうかわからない...:

var username = System.Web.HttpContext.Current.Session["user"]; 

は、私が戻ってユーザー名を取得します。私は、これは同時に信頼性の高いソリューションですが、これをテストするための便利な方法があるようには思えない全くわからない

(精巧な負荷テストなし)。

2つのワーカースレッドが同時にこのライブラリを呼び出す場合、私は、.NETフレームワークは、外部ライブラリは、他の場所から1つの場所から1つのユーザ名と他のを望んでいる知っているかどうかはわかりません。

関連する問題