我正在尝试使用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
的类,其中包含两个String属性(User
和Password
),并且所有客户端方法都会接收此类的对象作为第一个参数,但Axis WS客户端没有发生。
如何在客户端调用中设置此标头?
答案 0 :(得分:29)
也许您可以使用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...
答案 1 :(得分:2)
如果您有一个使用用户ID和密码表示Authentication
容器的对象,您可以这样做:
import org.apache.axis.client.Stub;
//...
MyAuthObj authObj = new MyAuthObj("userid","password");
((Stub) yourServiceObject).setHeader("urn://your/name/space/here", "partName", authObj);
答案 2 :(得分: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);
答案 3 :(得分:1)
我使用了与之前提到的几乎相同的解决方案:
SOAPHeaderElement cigWsHeader = new SOAPHeaderElement("https://ws.creditinfo.com", "CigWsHeader"); cigWsHeader.addChildElement("UserName").setValue("username"); cigWsHeader.addChildElement("Password").setValue("password"); var port = new ServiceLocator().getServiceSoap(someUrl); ((Stub) port).setHeader(cigWsHeader);
并花了数小时搜索“未找到安全标头”的原因。答案是...命名空间中的冗余符号 "/" : "https://ws.creditinfo.com/" 。严重地!记住它。