我完全坚持 ONVIF 身份验证。我想我已尝试过所有内容或至少几乎所有内容,但我在互联网上找不到足够的信息。我使用svcutil创建了存根客户端,我的代码用于进行身份验证(其中一个是因为我尝试过很多东西):
string uri = "http://140.0.22.39/onvif/services";
EndpointAddress serviceAddressPrueba = new EndpointAddress(uri);
HttpTransportBindingElement httpBinding = new HttpTransportBindingElement();
httpBinding.AuthenticationScheme = AuthenticationSchemes.Digest;
var messegeElement = new TextMessageEncodingBindingElement();
messegeElement.MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None);
CustomBinding bindprueba = new CustomBinding(messegeElement, httpBinding);
DeviceClient clientprueba = new DeviceClient(bindprueba, serviceAddressPrueba);
string passwordDigestBase64;
//HERE I PUT THE CODE TO ENCRYPT THE PASSWORD.
PasswordDigestBehavior behavior1 = new PasswordDigestBehavior("root",passwordDigestBase64);
clientprueba.Endpoint.Behaviors.Add(behavior1);
string d1;
string d2;
string d3;
string d4;
clientprueba.GetDeviceInformation(out d1, out d2, out d3, out d4);
之后出现以下错误:
{"The remote server returned an unexpected response: (400) Bad Request."}
如果您愿意帮我解决这个问题,我将非常非常感谢。
答案 0 :(得分:0)
有几件事可能导致这种情况:
您已通过网络浏览器设置了root密码,从而锁定了ONVIF用户。登录相机并添加ONVIF用户(有一个特殊页面)
您的密码摘要仅包含密码,其中应包含随机随机数,创建时间和密码的串联。
您的本地时钟与相机的时钟不同步。调用getSystemDateAndTime来读取远程时钟并记录你之间的时差。
这些是让我放慢速度的4个主要因素中的3个(第4个是导入wsdl,但看起来你已经得到了它)
答案 1 :(得分:0)
尝试这种方式:
ServicePointManager.Expect100Continue = false;
var endPointAddress = new EndpointAddress("http://" + cameraAddress + "/onvif/device_service");
var httpTransportBinding = new HttpTransportBindingElement { AuthenticationScheme = AuthenticationSchemes.Digest };
var textMessageEncodingBinding = new TextMessageEncodingBindingElement { MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None) };
var customBinding = new CustomBinding(textMessageEncodingBinding, httpTransportBinding);
var passwordDigestBehavior = new PasswordDigestBehavior(adminName, adminPassword);
var deviceClient = new DeviceClient(customBinding, endPointAddress);
deviceClient.Endpoint.Behaviors.Add(passwordDigestBehavior);
请注意,将ServicePointManager.Expect100Continue
设置为false
非常重要。