Аутентификация ONVIF в .NET 4.0 с Visual Studios 2010

StackOverflow. Недавно я начал новую работу, и я впервые трогаю .NET и все связанные с ней программные продукты, шаблоны, концепции и даже языки.

Моя задача - попытаться установить связь с камерой ONVIF в здании, чтобы, в конечном счете, обновить корпоративное домовое решение, чтобы автоматически распознавать камеры ONVIF и иметь возможность устанавливать их и использовать их службы.

Я уже могу собрать некоторые основные сведения, такие как его модель, ее MAC-адрес и его версию прошивки следующим образом:

       EndpointAddress endPointAddress = new EndpointAddress("<mycameraurl:<mycameraport>/onvif/device_service");
        CustomBinding bind = new CustomBinding("DeviceBinding");
        DeviceClient temp = new DeviceClient(bind, endPointAddress);
        String[] arrayString = new String[4];
        String res = temp.GetDeviceInformation(out arrayString[0], out arrayString[1], out arrayString[2], out  arrayString[3]);
        MessageBox.Show("Model " + arrayString[0] + ", FirmwareVersion " + arrayString[1] + ", SerialNumber " + arrayString[2] + ", HardwareId " + arrayString[3]);

У меня есть эта спецификация xml для customBinding в моем файле app.config:

 <customBinding>
    <binding name="DeviceBinding">
      <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
          messageVersion="Soap12" writeEncoding="utf-8">
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      </textMessageEncoding>
      <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
          maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
          bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
          keepAliveEnabled="false" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
          realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
          useDefaultWebProxy="true" />
    </binding>
  </customBinding>

Моя проблема в том, что мне не удается глубже проникнуть в то, что я могу спросить у камеры. Я получаю ошибки "400 - Плохой запрос" за все, что я пытаюсь, и в соответствии с тем, что я прочитал, потому что мне нужно обрабатывать аутентификацию для камеры.

Проблема в том, что, поскольку я новичок, все, что я нахожу в WS-Security (которое, кажется, используется ONVIF), действительно, действительно запутано, с множеством разных решений, и ничто действительно не работает для меня. Например, это сообщение здесь заставляет это звучать очень просто, но я попытался создать UserNameSecurityToken, и я все еще получаю 400 ошибок с ошибками. Поскольку я не знаю, было ли это потому, что я неправильно написал свою систему Token, если это потому, что камера не поддерживает то, что я пытаюсь сделать...

Я уже пробовал WSHttpBinding и помещал его в режим пользователя, но с использованием WSHttpBinding нарушил основное обнаружение информации, которое я смог создать (с ошибкой MustUnderstand)...

Любые указатели для меня? Простые учебники WS-Security/.NET, С#/ONVIF, все будет принято.

Пожалуйста, простите меня за любые английские ошибки, я не носитель языка. Я также знаю, что моя просьба очень расплывчата, поэтому извините, но я настоящий noob на этом, первый раз прося о помощи в Интернете.

Ответ 1

Хорошо, я надеюсь, что это в конечном итоге поможет другим людям застрять, как я:

EndpointAddress serviceAddress = new EndpointAddress ( "/onvif/device_service" );

HttpTransportBindingElement httpBinding = new HttpTransportBindingElement();

httpBinding.AuthenticationScheme = AuthenticationSchemes.Digest;

var messageElement = new TextMessageEncodingBindingElement();

messageElement.MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None);

CustomBinding bind = new CustomBinding (messageElement, httpBinding);

//Добавьте наше пользовательское поведение - для этого требуется Microsoft WSE 3.0 SDK

PasswordDigestBehavior behavior = new PasswordDigestBehavior (CameraASCIIStringLogin, CameraASCIIStringPassword);

Клиент DeviceClient = новый DeviceClient (bind, serviceAddress);

client.Endpoint.Behaviors.Add(поведение);

//Теперь мы можем запросить информацию

client.GetSystemDateAndTime();

client.GetNetworkInterfaces();

client.GetScopes();

client.GetRelayOutputs();

client.GetWsdlUrl();

Проблема заключалась в том, что камера требовала аутентификации, прежде чем предоставлять какую-либо информацию, кроме простейших, и самой сложной частью было, наконец, поймать рабочее xml-сообщение onvif, чтобы воссоздать его в моем собственном программном обеспечении.