В настоящее время я пытаюсь использовать веб-сервис из клиента 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 из сетевого монитора.
Пару моментов отметить,
- Услуга не моя, но я предполагаю, что это работает, как я могу проверить его с другого клиента успешно.
- Да, я знаю, что службы SOAP теперь обесцениваются, и мы должны переместить весь наш код в WCF, он выполняется и в конечном итоге будет возвращен в дом.
- Мы хотели использовать Basic auth для службы, но Flex не позволяет мне добавлять заголовки HTTP в запрос SOAP, так что это не так.
- Все это выполняется по протоколу 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>