Вот мои детали проектаHttpContext.Current является недействительным после Task.Run
- проекта веб-API, содержащие контроллеры WebAPI
- У меня есть отдельный C# библиотека проект, который содержит модели для моей WebAPI и каким-либо способом и api для работы с базой данных.
настройки в WebConfig
<httpRuntime targetFramework="4.5"/>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
Выпуска: HttpContext.Current.user является null.I хочет получить доступ к Httpcontext.Current.user в моем гр проекте # библиотеки.
1.В этом фрагменте кода ниже HttpContext.Current.user доступен. Этот метод существует в проекте webapi.
[HttpPost]
public async Task<IHttpActionResult> Post([FromBody]TEntity entity)
{
System.Security.Principal.IPrincipal p = System.Threading.Thread.CurrentPrincipal;
// context is available till here
var context =HttpContext.Current.User;
return await Task<IHttpActionResult>.Run(() =>
{
if (!ModelState.IsValid)
{
return (IHttpActionResult)Content(HttpStatusCode.BadRequest, ModelState.ToUnexpectedResultWrapper());
}
try
{
TOrchestrator orchestrator = new TOrchestrator();
orchestrator.Insert(entity);
}
catch (ValidationException ex)
{
return Content(HttpStatusCode.BadRequest, ex.ToUnexpectedResultWrapper());
}
catch (DbEntityValidationException ex)
{
return Content(HttpStatusCode.BadRequest, ex.ToUnexpectedResultWrapper());
}
return CreatedAtRoute("REST", new { id = entity.Id }, entity);
});
}
2. В фрагменте кода ниже, который существует в библиотеке C#. HttContext.Current.user имеет значение null. этот метод вызывается из вышеуказанного метода «Почта».
public void Insert(Market market)
{
// Context is
System.Security.Principal.IPrincipal p = System.Threading.Thread.CurrentPrincipal;
//IOATIApplicationUser user = UserContextHelper.GetOATIContext().OATIUser;
var http = HttpContext.Current.User;
RunAction<InsertAction, Market>(market);
}
Более я мог получить доступ к объекту пользователя из System.Threading.Thread.CurrentPrincipal.
Если я не могу получить доступ к объекту пользователя из HttpContext. Может ли пользовательская система> System.Threading.Thread.CurrentPrincipal. Я слышал, что это не безопасно для пользователя «System.Threading.Thread.CurrentPrincipal», и это касается только оконных форм.
'System.Threading.Thread.CurrentPrincipal' получает пользователь сайт работает, как, что часто не фактический пользователь, который обращается к сайту. Вместо того, чтобы использовать 'HttpContext.Current' для получения ваших данных, почему бы не передать его в свой метод' Insert' в качестве параметра? Библиотеки часто не должны зависеть от наличия доступного «HttpContext» и должны получать необходимую информацию через параметры, чтобы сохранить переносимый код. – mason
спасибо масон. Это имеет смысл – harmeet