14

我正在尝试使用 Axis 使用 .NET 2.0 Web 服务。我使用 Eclipse WST 插件生成了 Web 服务客户端,到目前为止似乎还可以。

这里是预期的 SOAP 标头:

<soap:Header>
<Authentication xmlns="http://mc1.com.br/">
    <User>string</User>
    <Password>string</Password>
</Authentication>
</soap:Header>

我没有找到任何关于如何从 Axis 客户端配置此标头的文档。当我使用 Visual Studio C# Express 2008 生成客户端时,它会生成一个以Authentication两个字符串属性 (UserPassword) 命名的类,并且所有客户端方法都接收该类的对象作为第一个参数,但 Axis WS 客户端不会发生这种情况。

如何在客户端调用中设置此标头?

4

4 回答 4

32

也许你可以使用org.apache.axis.client.Stub.setHeader方法?像这样的东西:

MyServiceLocator wsLocator = new MyServiceLocator();
MyServiceSoap ws = wsLocator.getMyServiceSoap(new URL("http://localhost/MyService.asmx"));

//add SOAP header for authentication
SOAPHeaderElement authentication = new SOAPHeaderElement("http://mc1.com.br/","Authentication");
SOAPHeaderElement user = new SOAPHeaderElement("http://mc1.com.br/","User", "string");
SOAPHeaderElement password = new SOAPHeaderElement("http://mc1.com.br/","Password", "string");
authentication.addChild(user);
authentication.addChild(password);
((Stub)ws).setHeader(authentication);

//now you can use ws to invoke web services...
于 2009-04-26T20:05:51.660 回答
3

如果你有一个对象代表Authentication带有用户 ID 和密码的容器,你可以这样做:

import org.apache.axis.client.Stub;

//...

MyAuthObj authObj = new MyAuthObj("userid","password");
((Stub) yourServiceObject).setHeader("urn://your/name/space/here", "partName", authObj);
于 2010-06-15T17:45:10.767 回答
1

我有同样的问题,并通过以下片段解决:

ServiceSoapStub clientStub = (ServiceSoapStub)new ServiceLocator().getServiceSoap(url);
org.apache.axis.message.SOAPHeaderElement header = new org.apache.axis.message.SOAPHeaderElement("http://www.abc.com/SSsample/","AuthHeader");
SOAPElement node = header.addChildElement("Username");
node.addTextNode("aat");
SOAPElement node2 = header.addChildElement("Password");
node2.addTextNode("sd6890");

((ServiceSoapStub) clientStub).setHeader(header);
于 2013-05-15T16:49:27.573 回答
1

我使用了与前面提到的几乎相同的解决方案:

SOAPHeaderElement cigWsHeader = new SOAPHeaderElement("https://ws.creditinfo.com", "CigWsHeader");
cigWsHeader.addChildElement("用户名").setValue("用户名");
cigWsHeader.addChildElement("密码").setValue("密码");

var port = new ServiceLocator().getServiceSoap(someUrl);
((Stub) 端口).setHeader(cigWsHeader);

并花了几个小时搜索“找不到安全标头”的原因。答案是......命名空间中的冗余符号“/”:“https://ws.creditinfo.com/”。严重地!记在心上。

于 2021-03-03T08:21:43.083 回答