ServiceModel
От: binks Россия  
Дата: 26.01.24 05:04
Оценка:
Привет.

Есть сервис, предоставляющий 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 и всё быстро отрабатывает. Что интересно, мой сервис тоже иногда может нормально отработать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.