2015-07-28 2 views
0

В настоящее время я пытаюсь использовать веб-сервис из клиента Flex и попал в небольшую проблему. Служба читает заголовок SOAP под названием «AuthHeader» учетных данных, и он работает от тестового клиента (с помощью Шторма от CodePlex), используя этот запрос:SOAP Web Service Auth Headers issue

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
    <AuthHeader xmlns="http://ns.stickykiwi.com/"> 
     <Username /> 
     <Password /> 
    </AuthHeader> 
    </soap:Header> 
    <soap:Body> 
    <Authenticate xmlns="http://ns.stickykiwi.com/" /> 
    </soap:Body> 
</soap:Envelope> 

служба возвращает истину (Boolean), если учетные данные в порядке, false, если нет. Теперь, когда я называю обслуживание от Flex посылает это:

<?xml version="1.0" encoding="utf-8"?> 
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Header> 
     <ns0:AuthHeader xmlns:ns0="https://stickykiwi01"> 
      <ns0:Password/> 
      <ns0:Username/> 
     </ns0:AuthHeader> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
     <tns:Authenticate xmlns:tns="http://ns.stickykiwi.com/"/> 
    </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 

Это возвращает,

'System.NullReferenceException: Object reference not set to an instance of an object' 

потому, что по какой-то причине, вероятно, самым известным кому-то с лучшим зрением, чем у меня, есть серьезная разница между этими двумя запросами я просто этого не вижу.

Итак, как мне создать заголовки в Flex? У меня есть этот код в файле определения сервиса веб:

var qname:QName = new QName("https://stickykiwi01","AuthHeader"); 
    var header:SOAPHeader = new SOAPHeader(qname,{Username:"",Password:""}); 
    _serviceControl.addHeader(header); 

, который находится в файле под названием _Super_AuthenticationServices.as. Я вытащил запрос Flex из сетевого монитора.

Пару моментов отметить,

  1. Услуга не моя, но я предполагаю, что это работает, как я могу проверить его с другого клиента успешно.
  2. Да, я знаю, что службы SOAP теперь обесцениваются, и мы должны переместить весь наш код в WCF, он выполняется и в конечном итоге будет возвращен в дом.
  3. Мы хотели использовать Basic auth для службы, но Flex не позволяет мне добавлять заголовки HTTP в запрос SOAP, так что это не так.
  4. Все это выполняется по протоколу HTTPS, потому что я знаю, что он не защищен, поскольку учетные данные передаются в виде обычного текста. Как только мы это выполним, мы передадим одну хэшированную строку (то же самое, что и базовый auth), и разобьем ее на сервере тоже, этот способ намного проще отлаживать.

Благодарим вас за советы.

EDIT

Это то, что служба ожидает, и я думаю, что я встречаю, что критерии, я не могу видеть проблему здесь вообще.

POST /services/_authentication/authenticationservices.asmx HTTP/1.1 
Host: stickykiwi01 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://ns.stickykiwi.com/Authenticate" 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
     <soap:Header> 
      <AuthHeader xmlns="http://ns.stickykiwi.com/"> 
       <Username>string</Username> 
       <Password>string</Password> 
      </AuthHeader> 
     </soap:Header> 
     <soap:Body> 
      <Authenticate xmlns="http://ns.stickykiwi.com/" /> 
     </soap:Body> 
    </soap:Envelope> 

ответ

0

Нет, это работает.

Не уверен, что происходит, но я ничего не изменилось, но сегодня утром заголовки работают точно так, как и ожидалось, здесь запрос

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Header> 
     <tns:AuthHeader xmlns:tns="http://ns.stickykiwi.com/">  
      <tns:Username></tns:Username>  
      <tns:Password></tns:Password> 
     </tns:AuthHeader> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
     <tns:Authenticate xmlns:tns="http://ns.stickykiwi.com/"/> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Единственное различие, которое я вижу в том, что теперь префикс tns на все, а не ns0. Но в любом случае проблема разрешена, возможно, через магию.

С благодарностью