WCF через ARR: исчезающий файл cookie
После развертывания библиотеки служб WCF на новом веб-ферме с использованием ARR и IIS в Windows 2012 я столкнулся с небольшой проблемой.
Пытаясь вызвать метод с помощью wcftestclient, я получаю "Маркер контекста безопасности истек или недействителен. Сообщение не было обработано".
Я включил куки в файле конфигурации. Глядя на поток трафика в Wireshark, это то, что я вижу:
-> POST, SOAP
<- Set-Cookie: ARRAffinity=..., SOAP
-> POST, Cookie: ARRAffinity=..., SOAP
<- SOAP
-> POST, Cookie: ARRAffinity=..., SOAP
<- SOAP
-> POST, SOAP (no cookie)
<- SOAP (500)
Дамп из wireshark с удаленным содержимым: https://ghostbin.com/paste/mshuk
Глядя на журналы в splunk, я вижу, что окончательный POST направляется на сервер фермы, отличный от предыдущих, что делает контекст безопасности недействительным.
1 ответ
Это не совсем решение вашей проблемы, но я надеюсь, что это поможет людям.
Поскольку я не мог найти правильный способ обработки файлов cookie ARR, я решил проблему в другом направлении: как сделать WCF полностью без сохранения состояния, чтобы каждый вызов мог выполняться на любом сервере, поэтому нас больше не заботит ARR печенье.
На стороне WCF все довольно просто: установите в привязке EstablishSecurityContext = false.
В коде:
binding.Security.Message.EstablishSecurityContext = false;
В xml:
<binding name="SecureBindingBigSize">
<security mode="TransportWithMessageCredential">
<message establishSecurityContext="false" clientCredentialType="UserName"/>
</security>
</binding>
Конечно, ваше приложение должно быть совместимо с этим поведением (= не использовать сессию).
Для информации, мой WsHttpBinding использует https и TransportWithMessageCredential security.