SOAP Web服务Auth Headers问题

时间:2015-07-28 19:39:45

标签: web-services actionscript-3 flex soap flashdevelop

我目前正在尝试使用Flex客户端的Web服务,并遇到一个小问题。该服务读取名为' AuthHeader'的SOAP标头。对于凭据,它使用此请求从测试客户端(使用来自CodePlex的Storm)工作:

<?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>

如果凭据正常,则服务返回true(布尔值),否则返回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'

因为某些原因,可能是视力比我更好的人所知,这2个请求之间存在严重差异,我只是没有看到它。

那么,如何在Flex中创建标题?我在Web服务定义文件中有这段代码:

    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运行的,因为我知道它不安全,因为凭据作为纯文本传递,一旦我们运行了这个,我们将传递一个哈希字符串(与基本身份验证相同)并在服务器上取消它这种方式也更容易调试。
  5. 感谢您的建议。

    修改

    这就是服务的期望,我认为我符合这个标准,我根本看不到问题。

    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>
    

1 个答案:

答案 0 :(得分: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。但无论如何,问题可能通过魔法解决了。

由于