HttpContext.Current.User не устанавливается после установки.NET Framework 4.5

Я использовал.NET 4.0 VS10. У меня были рабочие сервисы WCF, которые использовали аутентификацию форм. Я обновился до VS11, .NET 4.5.

Теперь мой HttpContext.Current.User является нулевым в запросе wcf. Я ввел куки от логина на этот запрос.

HttpRequestMessageProperty httpRequest;
...
httpRequest.Headers.Add(HttpRequestHeader.Cookie, cookie);

Есть идеи, как заставить это работать снова?

Уже есть

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

и

[AspNetCompatibilityRequirements(RequirementsMode = spNetCompatibilityRequirementsMode.Required)]

2 ответа

Решение

Если вы столкнулись с этой проблемой в одностороннем порядке (операции, помеченные [OperationContract (IsOneWay = true)]) контрактом операции WCF, вот причина этой проблемы. HttpContext является конструкцией asp.net. После успешного вызова односторонней операции модель сервиса отправляет обратно ответ 202 (принято) клиенту.

  • В 4.5 asp.net удаляет HttpContext, так как ответ уже был отправлен обратно клиенту, который разработан.
  • В 4.0 это просто счастливое совпадение, что этот неподдерживаемый сценарий сработал.

Так как мы нашли несколько отчетов клиентов по этому поводу, в обновлении.net 4.5.1 сделано причудливое исправление. Чтобы дать более подробную информацию об исправлении:

  1. Если ваш проект все еще нацелен на 4.0 и вы запускаете приложение на машине 4.5.1, тогда ваша проблема будет исправлена ​​(внутренняя проверка на наличие целевой версии фреймворка).
  2. Если ваш проект перенаправлен на 4.5, то Httpcontext.Current.User снова станет нулевым по причинам, которые я упомянул выше. Попробуйте использовать OperationContext.Current.ServiceSecurityContext.WindowsIdentity, чтобы получить идентификатор пользователя вместо свойства HttpContext.Current.User. Это свойство не зависит от хоста и заполняется при аутентификации вашего клиента.

Здесь есть решение аналогичной проблемы:

добавлять

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

в ваш конфигурационный файл.

Другие вопросы по тегам