Привет.
Есть сервис, предоставляющий wsdl, генерирую по нему ServiceModel.
Обмен по https, для аутентификации используется Bearer токен.
var timeout = new TimeSpan(0, 20, 0);
var address = new EndpointAddress(URL);
BasicHttpsBinding binding = new()
{
ReaderQuotas = XmlDictionaryReaderQuotas.Max,
MaxReceivedMessageSize = int.MaxValue,
SendTimeout = timeout,
ReceiveTimeout = timeout,
UseDefaultWebProxy = UseSystemProxy
};
binding.Security.Mode = BasicHttpsSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; // можно поставить Basic и заполнить UserName и Password, но это ничего не меняет
_client = new Client(binding, address);
(IContextChannel)_client.InnerChannel).OperationTimeout = timeout;
_client.Endpoint.AddCustomHeader("Bearer " + Token); // до IClientMessageInspector.BeforeSendRequest в данном случае не доходит
// где-то дальше
_client.Request();
// System.ServiceModel.Security.MessageSecurityException: 'Запрос HTTP не разрешен для схемы аутентификации клиента "Anonymous". От сервера получен заголовок аутентификации "Basic realm="Realm", Basic realm="Realm"".'
Если закомментировать
(IContextChannel)_client.InnerChannel).OperationTimeout = timeout;
то попадаем в IClientMessageInspector.BeforeSendRequest и я устанавливаю в заголовок токен, но дальше сервер не отвечает и спустя минуту вылетает исключение
System.TimeoutException: 'Истекло время ожидания канала запроса при ожидании ответа по истечении 00:18:59.1452021. Увеличьте значение времени ожидания, передаваемое при вызове Request, или значение SendTimeout в Binding. Время, выделенное для выполнения этой операции, может быть составной частью более длительного времени ожидания.'
Непонятно откуда взялось "00:18:59.1452021"
В итоге не понятно что вообще происходит:
1. Почему, если я трогаю (IContextChannel)_client.InnerChannel).OperationTimeout, не обязательно сюда что-то писать (значение по умолчанию 10 минут), можно просто прочитать, то падает с System.ServiceModel.Security.MessageSecurityException: 'Запрос HTTP не разрешен для схемы аутентификации клиента "Anonymous". От сервера получен заголовок аутентификации "Basic realm="Realm", Basic realm="Realm"".'
2. Если не трогать OperationTimeout, то сервис не отвечет. Но можно сделать запрос из SoapUI и всё быстро отрабатывает. Что интересно, мой сервис тоже иногда может нормально отработать.