Этот вопрос обсуждался здесь по нескольким темам, но я не смог найти ответ для меня.Запрос Onvif SOAP с аутентификацией уровня SOAP и аутентификацией HTTP
Что я пытаюсь сделать, это использовать IP-камеру через интерфейс Onvif. Я создал веб-службы из файлов WSDL, доступных на главной странице Onvif, и добавил пользовательский код аутентификации SOAP, как предлагалось here, и я могу получить возможности устройства и т. Д.
Но для некоторых служб, например, управление PTZ, также требуется HTTP-аутентификация. Мой код удаляет ClientCredentials
behaivor (так что да, я думаю, установка их не имеет никакого смысла, но я все равно оставил эти строки в надежде, что, может быть, HTTP транспорт будет пытаться использовать их):
HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement();
httpBindingElement.AuthenticationScheme = AuthenticationSchemes.Basic;
...
PTZClient ptzClient = new PTZClient(customBinding, endPointAddress);
ptzClient.Endpoint.Behaviors.Remove(typeof(System.ServiceModel.Description.ClientCredentials));
UsernameClientCredentials onvifCredentials = new UsernameClientCredentials(new UsernameInfo(_username, _password));
ptzClient.Endpoint.Behaviors.Add(onvifCredentials);
ptzClient.ClientCredentials.UserName.UserName = _username;
ptzClient.ClientCredentials.UserName.Password = _password;
Тем не менее, когда я посмотрите на wirehark, я вижу, что аутентификация SOAP сгенерирована, но не установлен заголовок HTTP-аутентификации (ну, я уже ожидал, что, поскольку у меня есть пользовательский поведение). Поэтому вопрос в том, что если я создаю привязку таким образом, каковы мои лучшие варианты добавления заголовков HTTP-аутентификации? Могу ли я просто добавить инспектор сообщений, и если да, то какие-нибудь примеры? Должен ли я создать другую транспортную привязку? Я видел, как люди советовали другим использовать BasicHttpBinding
, а затем установили на нем свойство Security
, но где в этом случае будут выполняться учетные данные и как применить экземпляр BasicHttpBinding
к моему привязке? Есть ли какие-либо обратные вызовы в WCF, которые запускаются с помощью кода HTTP 401, который я могу подключить, а затем предоставить заголовок? Это на самом деле мой первый опыт работы с WCF, и до сих пор я делал все из примеров, найденных в Интернете, но что касается этой конкретной проблемы, я ничего не смог найти.
Я согласен, но проблема в том, что с приведенным примером кода, даже когда HTTP-заголовок аутентификации возвращается с сервера, соединение не повторяет ответ, а просто терпит неудачу. –