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.

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