У меня есть следующий бит кода, который я взял из этого источника ...
public bool Initialise(string cameraAddress, string userName, string password)
{
bool result = false;
try
{
var messageElement = new TextMessageEncodingBindingElement()
{
MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None)
};
HttpTransportBindingElement httpBinding = new HttpTransportBindingElement()
{
AuthenticationScheme = AuthenticationSchemes.Digest
};
CustomBinding bind = new CustomBinding(messageElement, httpBinding);
mediaClient = new MediaClient(bind, new EndpointAddress($"http://{cameraAddress}/onvif/Media"));
mediaClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
mediaClient.ClientCredentials.HttpDigest.ClientCredential.UserName = userName;
mediaClient.ClientCredentials.HttpDigest.ClientCredential.Password = password;
var profs = mediaClient.GetProfiles();
//rest of the code...
Когда я запускаю wireshark, проходя через часть GetProfiles()
в отладчике, я вижу, что сгенерированный XML выглядит так:
Какой код потребуется для изменения xml, чтобы он выглядел следующим образом:
Как мне вызвать функцию GetSystemDateAndTime
?
Чтобы вызвать функцию GetProfiles
, мне нужно было создать MediaClient
и затем вызвать эту функцию ...
Существует ли такая вещь, как MediaClient для получения доступа к GetSystemDateAndTime ??
Edit:
Я обнаружил, что вы можете использовать DeviceClient
, чтобы получить доступ к функции GetSystemDateAndTime
...
Вам необходимо добавить wsdl для управления устройствами в подключенные службы, прежде чем:
https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl
Я также добавил туда System.Net.ServicePointManager.Expect100Continue = false;
, потому что видел, как кто-то сказал, что это помогло на этой ссылке ...
Итак, я добавил:
CustomBinding bind = new CustomBinding(messageElement, httpBinding);
System.Net.ServicePointManager.Expect100Continue = false;
DeviceClient d = new DeviceClient(bind, new EndpointAddress($"http://{cameraAddress}/onvif/device_service"));
var time = d.GetSystemDateAndTime();
Примечание:
Я все еще получаю ошибку:
ErrorMessage "The header 'To' from the namespace 'http://www.w3.org/2005/08/addressing' was not understood by the recipient of this message, causing the message to not be processed. This error typically indicates that the sender of this message has enabled a communication protocol that the receiver cannot process. Please ensure that the configuration of the client's binding is consistent with the service's binding. " string