2016-04-22 5 views
2

Мне нужно иметь возможность легко получить имя пользователя для множества запросов, которые мы запускаем в сборке вне проекта MVC. Я бы просто добавил параметр для всех вызовов, но их буквально сотни.Параллельный доступ к HttpContext извне библиотеки

Мой коллега посоветовал мне передать статическую ссылку на HttpContext (предположительно в OnApplicationStarted или что-то в этом роде) и получить отсюда имя пользователя.

HttpContext всегда имеет информацию, относящуюся к сеансу текущего пользователя. Моя забота об этом заключается в том, что если мой объект (который существует в отдельной сборке) не узнает, какой пользователь именно извлекает информацию, и что, хотя это может работать для одного пользователя, оно будет вызывать неправильное имя пользователя как больше пользователи начинают получать доступ к системе.

Является ли это жизнеспособным способом идентификации имени пользователя?

Как HttpContext знает, какой пользователь является текущим пользователем? Этот механизм разорван вне проекта?

+0

Если вы можете использовать Session во внешней библиотеке, тогда вы должны поместить имя пользователя в сеанс и получить к нему доступ оттуда. Все означает, что вы выбираете информацию о пользователе из сеанса. –

+0

@AnkushJain: Интересно отметить, что вы думаете, что он должен работать. Мой страх в том, что, поскольку это будет статический объект (т. Е. Только один для всех пользователей), когда пользователь будет вытащен, он может быть для кого-то другого. – micahhoover

+0

Я не говорю, чтобы создать статическую переменную. Я прошу использовать переменные сеанса. И сеансы всегда зависят от пользователя. –

ответ

2

Экземпляр HttpContext не является глобальным - это контекст для конкретного запроса. Так, например, если вы выполняете действие контроллера, и вы вызываете HttpContext (это Controller.HttpContext), тогда вы имеете дело с контекстом для этого запроса. Поэтому нет вопроса о том, для какого пользователя нужен контекст - для пользователя, который инициировал этот запрос.

Вы не хотели бы ссылаться на него с OnApplicationStarted. Он либо не будет доступен, либо будет контекстом для текущего запроса.

Если вы говорите, что вам нужно имя пользователя, то я не уверен, почему вы хотите передать целое HttpContext. Функция должна получать только те параметры, которые ей нужны. Если ему нужно имя пользователя, вы можете получить его от HttpContext.User.Identity.Name. Это упростит проверку другой библиотеки. И что, если другая библиотека вызывается, но не из веб-приложения? Тогда не будет HttpContext, чтобы пройти к нему.

0

Не уверен, что если другие предлагали эту самую вещь, но здесь идет ...

Мой коллега посоветовал мне ссылаться System.Web так:

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

вернусь имя пользователя.

Я не совсем уверен, что это одновременное надежное решение, но, похоже, нет удобного способа проверить это (без тщательного теста нагрузки).

Если два рабочих потока называют эту библиотеку одновременно, я не уверен, как .NET Framework знает, что внешняя библиотека хочет, чтобы одно имя пользователя было из одного места, а другое из другого места.

Смежные вопросы