Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Указать пространство имен


Автор: WERITAS 27.1.2011, 16:16
Добрый день. Пишу агента для веб-службы используя WCF. Когда на агенте выполняется метод GetProfiles, то в ответ приходит сообщение от веб-службы об ошибке. Я сравнил soap-запросы, которые отправляет мой агент и другой агент, который умеет с этой веб-службой работать.
Запрос моего агента:
Код

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">            
        <GetProfiles xmlns="http://www.onvif.org/ver10/media/wsdl"/>
    </s:Body>
</s:Envelope>


Запрос рабочего агента:
Код

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <GetProfiles xmlns="http://www.onvif.org/ver10/media/wsdl" />
    </s:Body>
</s:Envelope>


Отличается всего в одну строчку "<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">". 

Код моего агента совсем небольшой:
Код

            BasicHttpBinding binding = new BasicHttpBinding();
            EndpointAddress endPoint = new EndpointAddress("http://192.168.137.103:80/onvif/services");
            
            MediaClient mediaClient = new MediaClient(binding, endPoint);   // Здесь MediaClient - это прокси-класс для агента веб-службы.
            Profile[] profiles = mediaClient.GetProfiles();


Как мне нужно его изменить, чтобы имя пространства имён стало другим?

Автор: jonie 27.1.2011, 16:36
у вас похоже используется SOAP 1.1 (basicHttpBinding по умолчанию), когда сервис ожидает SOAP 1.2 (wsHttpBinding  по умолчанию). Укажите wsHttpBinding как биндинг.

Автор: WERITAS 28.1.2011, 06:53
Поменял тип привязки, значение имени пространства имен изменилось, но "лучше" от этого не стало. Теперь агентом  отправляется сообщение:
Код

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" 
            xmlns:a="http://www.w3.org/2005/08/addressing">
    <s:Header>
        <a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action>
        <a:MessageID>urn:uuid:dd58ab63-c698-46f6-a097-4a2668f8c7bd</a:MessageID>
        <a:ReplyTo>
            <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
        </a:ReplyTo>
        <a:To s:mustUnderstand="1">http://192.168.137.103/onvif/services</a:To>
    </s:Header>
    <s:Body>
        <t:RequestSecurityToken Context="uuid-10b755c7-42ee-48d1-82af-f98f52be40f9-1" 
                                xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust">
            <t:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</t:TokenType>
            <t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType>
            <t:KeySize>256</t:KeySize>
            <t:BinaryExchange ValueType="http://schemas.xmlsoap.org/ws/2005/02/trust/spnego" 
                              EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">TlRMTVNTUAABAAAAt4IY4gAAAAAAAAAAAAAAAAAAAAAGAbAdAAAADw==</t:BinaryExchange></t:RequestSecurityToken></s:Body></s:Envelope>


которое ничего общего не имеет с первым  smile 

Автор: jonie 28.1.2011, 10:17
WERITAS, ну это не полное сообщение. Еще секьюрите поставьте в none, если вас это так напрягает (парсер на стороне сервера не должно - он должен пропускать что непонимает как мне помнится).

Автор: WERITAS 28.1.2011, 12:48
Проблему решил поставив вместо BasicHttpBinding  CustomBinding, осталось только последнее - как сделать так, чтобы в отправляемом POST-запросе добавлялся заголовок аутентификации типа "Authorization: Basic cm9vdDoxMjM0"?

Пробовал по-разному, ни пока не работает никак. Вот мой код:
Код

            HttpTransportBindingElement httpTransportBindingElement = new HttpTransportBindingElement();
            httpTransportBindingElement.AuthenticationScheme = AuthenticationSchemes.Basic;
            httpTransportBindingElement.KeepAliveEnabled = false;

            CustomBinding binding = new CustomBinding(httpTransportBindingElement);

            EndpointAddress endPointAddress = new EndpointAddress("http://192.168.137.103:80/onvif/services");
            
            MediaClient mediaClient = new MediaClient(binding, endPointAddress);
            mediaClient.ClientCredentials.UserName.UserName = "root";
            mediaClient.ClientCredentials.UserName.Password = "1234";

            try
            {
                Console.WriteLine("Sending 'GetProfiles'");
                
                Profile[] profiles = mediaClient.GetProfiles();
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.Message);
            }

            mediaClient.Close();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)