Этот вопрос обсуждался в нескольких темах здесь, но я не смог найти ответ для себя.
Я пытаюсь использовать IP-камеру через интерфейс Onvif. Я создал веб-сервисы из файлов WSDL, доступных на домашней странице Onvif, и добавил собственный код аутентификации SOAP, как было предложено здесь, и я могу получить информацию о возможностях устройства и т. д. и т. д.
Но для некоторых сервисов, например, управления PTZ, также требуется HTTP-аутентификация. Мой код удаляет поведение ClientCredentials
(поэтому да, думаю, их установка не имеет никакого смысла, но я все же оставил эти строки в надежде, что, возможно, 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;
Тем не менее, когда я смотрю на wireshark, я вижу, что аутентификация SOAP сгенерирована, но заголовок аутентификации HTTP не установлен (ну, я уже ожидал этого, поскольку здесь у меня есть собственное поведение). Итак, вопрос в том, если я создаю привязку таким образом, каковы мои лучшие варианты добавления заголовков аутентификации HTTP? Могу ли я просто добавить инспектор сообщений, и если да, то какие примеры? Должен ли я создавать другую транспортную привязку? Я видел, как люди советовали другим использовать BasicHttpBinding
, а затем устанавливали для него свойство Security
, но куда в этом случае идут учетные данные и как мне применить экземпляр BasicHttpBinding
к моей привязке? Существуют ли какие-либо обратные вызовы в WCF, которые запускаются кодом HTTP 401, к которому я могу подключиться, а затем предоставить заголовок? На самом деле это мой первый опыт работы с WCF и до сих пор я делал все из примеров, найденных в Интернете, но что касается этой конкретной проблемы, я ничего не смог найти.