![](/img/trans.png)
[英]401 error when consuming a Web service with HTTP Basic authentication using CXF
[英]Error 401 when consuming web service from Domino
編輯:似乎Domino沒有將安全標頭與Soap請求一起發送。 我可以訪問服務提供商的日志,這是我發現的內容:
2016-06-09 10:27:01 EDT [MED.0050.0239D] Substituted fault reason = Mediator encountered an error:Incoming request does not contain the Authorization header. This service requires the HTTP Basic Authentication token to be present! while executing operation:retraitEquipementServMoCA service:equipementMoCA at time:10:27:01 on date:2016-06-09. The client ip was:10.150.1.34. The current user:Default. The consumer application:null
我必須修改使用Web服務的現有Lotus Notes應用程序。 在prod中一切都很好,但是在DEV中,我們有一個新的WSDL,並且終點也是DEV服務器。
我必須修改定義定位器,存根和服務的行,以使其與新的WSDL(端口名稱已更改)相適應,並且我認為我已經做到了這一點。
我不知道發生了什么事。 我讀到Domino只支持SOAP 1.1,所以我將WSDL修改為使用soap 1.1而不是1.2,但是仍然出現401錯誤。
現在,我已經從WSDL中重建了Domino中的Web使用者大約3-4次,並且我無法停止獲取401錯誤。 這是日志的一部分:
2016-06-09 08:26:25 HTTP JVM: DEBUG endpoint: http://bsiesglba1.int.videotron.com:5555/ws/equipementMoCA
2016-06-09 08:26:25 HTTP JVM: DEBUG portname: equipementMoCA.equipementMoCAsoaphttp
2016-06-09 08:26:25 HTTP JVM: ==DEBUG==
2016-06-09 08:26:25 HTTP JVM: URL: http://bsiesglba1.int.videotron.com:5555/ws/equipementMoCA
2016-06-09 08:26:25 HTTP JVM: User: :
2016-06-09 08:26:25 HTTP JVM: Erreur MoCa : Agent MoCaRequest
2016-06-09 08:26:25 HTTP JVM: WebServiceEngineFault
2016-06-09 08:26:25 HTTP JVM: faultCode: {http://www.lotus.com/domino/ws/}HTTP
2016-06-09 08:26:25 HTTP JVM: faultSubcode:
2016-06-09 08:26:25 HTTP JVM: faultString: (401) 401
2016-06-09 08:26:25 HTTP JVM: faultActor:
2016-06-09 08:26:25 HTTP JVM: faultNode:
2016-06-09 08:26:25 HTTP JVM: faultDetail:
2016-06-09 08:26:25 HTTP JVM: {}string:
2016-06-09 08:26:25 HTTP JVM: (401) 401
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.axis.transport.http.HTTPSender.readFromSocket(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.axis.transport.http.HTTPSender.invoke(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.axis.strategies.InvocationStrategy.visit(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.axis.SimpleChain.doVisiting(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.axis.SimpleChain.invoke(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.axis.client.AxisClient.invoke(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.axis.client.Call.invokeEngine(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.axis.client.Call.invoke(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.axis.client.Call.invoke(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.axis.client.Call.invoke(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.axis.client.Call.invoke(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.websvc.client.Call.invoke(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at com.videotron.www.MoCA.gestionEquipement.ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_BinderStub.retraitEquipementServMoCA(ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_BinderStub.java:20)
2016-06-09 08:26:25 HTTP JVM: at com.videotron.factory.equipementMoCaFactory.WSClientFactory.wsRemoveEquipment(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at MoCaRequest.NotesMain(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.AgentBase.runNotes(Unknown Source)
2016-06-09 08:26:25 HTTP JVM: at lotus.domino.NotesThread.run(Unknown Source)
這是WSDL:
<wsdl:definitions name="equipementMoCA" targetNamespace="http://www.videotron.com/MoCA/gestionEquipement" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:tns="http://www.videotron.com/MoCA/gestionEquipement" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/">
<wsdl:documentation/>
<wsdl:types>
<xsd:schema targetNamespace="http://www.videotron.com/MoCA/gestionEquipement">
<xsd:complexType name="retraitEquipementServMoCA">
<xsd:sequence>
<xsd:element name="noCompteClient" nillable="true" type="xsd:string"/>
<xsd:element name="noSerie" nillable="true" type="xsd:string"/>
<xsd:element name="typeAppareil" nillable="true" type="xsd:string"/>
<xsd:element name="systemeSource" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="cErrorDefRec">
<xsd:sequence>
<xsd:element name="errorNb" nillable="true" type="xsd:string"/>
<xsd:element name="errorText" nillable="true" type="xsd:string"/>
<xsd:element name="severity" nillable="true" type="xsd:string"/>
<xsd:element name="errorType" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ajoutEquipementServMoCA">
<xsd:sequence>
<xsd:element name="noCompteClient" nillable="true" type="xsd:string"/>
<xsd:element name="noSerie" nillable="true" type="xsd:string"/>
<xsd:element name="typeAppareil" nillable="true" type="xsd:string"/>
<xsd:element name="systemeSource" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="ajoutEquipementServMoCA" type="tns:ajoutEquipementServMoCA"/>
<xsd:element name="cErrorDefRec" type="tns:cErrorDefRec"/>
<xsd:element name="retraitEquipementServMoCA" type="tns:retraitEquipementServMoCA"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="equipementMoCA_PortType_retraitEquipementServMoCA">
<wsdl:part name="parameters" element="tns:retraitEquipementServMoCA">
</wsdl:part>
</wsdl:message>
<wsdl:message name="equipementMoCA_PortType_ajoutEquipementServMoCA">
<wsdl:part name="parameters" element="tns:ajoutEquipementServMoCA">
</wsdl:part>
</wsdl:message>
<wsdl:message name="equipementMoCA_PortType_cErrorDefRec">
<wsdl:part name="parameters" element="tns:cErrorDefRec">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="equipementMoCA_PortType">
<wsdl:operation name="ajoutEquipementServMoCA">
<wsdl:input message="tns:equipementMoCA_PortType_ajoutEquipementServMoCA">
</wsdl:input>
<wsdl:output message="tns:equipementMoCA_PortType_cErrorDefRec">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="retraitEquipementServMoCA">
<wsdl:input message="tns:equipementMoCA_PortType_retraitEquipementServMoCA">
</wsdl:input>
<wsdl:output message="tns:equipementMoCA_PortType_cErrorDefRec">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_Binder" type="tns:equipementMoCA_PortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="ajoutEquipementServMoCA">
<soap:operation soapAction="ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_Binder_ajoutEquipementServMoCA" style="document"/>
<wsdl:input>
<soap:body parts="parameters" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body parts="parameters" use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="retraitEquipementServMoCA">
<soap:operation soapAction="ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_Binder_retraitEquipementServMoCA" style="document"/>
<wsdl:input>
<soap:body parts="parameters" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body parts="parameters" use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="equipementMoCA">
<wsdl:port name="equipementMoCAsoaphttp" binding="tns:ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_Binder">
<soap:address location="http://bsiesglba1.int.videotron.com:5555/ws/equipementMoCA"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
最后,wsFactory類的代碼:
public class WSClientFactory {
private String endPoint;
private String userName;
private String password;
private int timeOutDelayInMilliSec =60000; //default
// ****** propriétées input du ws ********
private String noCompteClient= new String("");
private String noSerie= new String("");
private String typeAppareil= new String("");
private String systemeSource= new String("");
// ****** propriétées output du ws ********
private StringHolder errorNb= new StringHolder("");
private StringHolder errorText= new StringHolder("");
private StringHolder severity= new StringHolder("");
private StringHolder errorType= new StringHolder("");
// ****** propriétés locales
EquipementMoCALocator locator;
ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_BinderStub stub;
EquipementMoCA_PortType service;
public WSClientFactory(String endPoint, String userName, String password, int timeOutDelayInMilliSec ) throws ServiceException, MalformedURLException {
this.endPoint = endPoint;
this.userName = userName;
this.password = password;
this.timeOutDelayInMilliSec = timeOutDelayInMilliSec;
// The Locator class knows how to access our web service
//ServiceActivationMoCALocator locator = new ServiceActivationMoCALocator();
locator = new EquipementMoCALocator();
//stub = (ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_BinderStub) locator.getServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_Port(new URL(endPoint));
//service = locator.getServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_Port();
stub = (ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_BinderStub) locator.getEquipementMoCAsoaphttp(new URL(endPoint));
service = locator.getEquipementMoCAsoaphttp();
System.out.print("DEBUG endpoint: " + stub.getEndpoint());
System.out.print("DEBUG portname: " + stub.getPortName());
// setting du timeout pour la durée maxi avant output du ws
stub.setTimeout(timeOutDelayInMilliSec);
// Authentication
if (!userName.equals("")){
stub._setProperty(lotus.domino.axis.client.Call.USERNAME_PROPERTY, userName);
stub._setProperty(lotus.domino.axis.client.Call.PASSWORD_PROPERTY, password);
}
}
public WSClientFactory(String endPoint, String userName, String password)throws ServiceException, MalformedURLException {
this.endPoint = endPoint;
this.userName = userName;
this.password = password;
// The Locator class knows how to access our web service
//ServiceActivationMoCALocator locator = new ServiceActivationMoCALocator();
locator = new EquipementMoCALocator();
//stub = (ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_BinderStub) locator.getServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_Port(new URL(endPoint));
//service = locator.getServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_Port();
stub = (ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_BinderStub) locator.getEquipementMoCAsoaphttp(new URL(endPoint));
service = locator.getEquipementMoCAsoaphttp();
// setting du timeout pour la durée maxi avant output du ws
stub.setTimeout(timeOutDelayInMilliSec);
// Authentication
if (!userName.equals("")){
stub._setProperty(lotus.domino.axis.client.Call.USERNAME_PROPERTY, userName);
stub._setProperty(lotus.domino.axis.client.Call.PASSWORD_PROPERTY, password);
}
}
/*
* Methode permettant de faire l'ajout d'un appareil (noSerie) au comtpe client(noCompteClient) dans le dépôt MoCa
*/
public boolean wsAddEquipment(String noCompteClient, String noSerie, String typeAppareil, String systemeSource) throws MalformedURLException, ServiceException, RemoteException{
service.ajoutEquipementServMoCA(noCompteClient, noSerie, typeAppareil, systemeSource,
this.errorNb, this.errorText, this.severity, this.errorType);
// dans la réponse du ws, si la valeur de erroNb = 0, c'est que ça a fonctionné
if (this.errorNb.equals("0")){
return true;
}else {
return false;
}
}
/*
* Methode permettant de faire la suppression d'un appareil (noSerie) au comtpe client(noCompteClient) dans le dépôt MoCa
*/
public boolean wsRemoveEquipment(String noCompteClient, String noSerie, String typeAppareil, String systemeSource) throws MalformedURLException, ServiceException, RemoteException{
service.retraitEquipementServMoCA(noCompteClient, noSerie, typeAppareil, systemeSource,
this.errorNb, this.errorText, this.severity, this.errorType);
// dans la réponse du ws, si la valeur de erroNb = 0, c'est que ça a fonctionné
if (this.errorNb.equals("0")){
return true;
}else {
return false;
}
}
和存根類:
package com.videotron.www.MoCA.gestionEquipement;
public class ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_BinderStub extends lotus.domino.websvc.client.Stub implements com.videotron.www.MoCA.gestionEquipement.EquipementMoCA_PortType {
public ServiceConfActMngt_HomeNetworking_webservices_equipementMoCA_BinderStub(java.net.URL endpointURL, javax.xml.rpc.Service service) throws lotus.domino.types.Fault {
super(endpointURL, service);
}
public void ajoutEquipementServMoCA(java.lang.String noCompteClient, java.lang.String noSerie, java.lang.String typeAppareil, java.lang.String systemeSource, javax.xml.rpc.holders.StringHolder errorNb, javax.xml.rpc.holders.StringHolder errorText, javax.xml.rpc.holders.StringHolder severity, javax.xml.rpc.holders.StringHolder errorType) throws java.rmi.RemoteException {
lotus.domino.websvc.client.Call _call = createCall("ajoutEquipementServMoCA");
java.lang.Object _resp = _call.invoke(new java.lang.Object[] {noCompteClient, noSerie, typeAppareil, systemeSource});
errorNb.value = (java.lang.String) _call.convertOutputParam("", "errorNb", java.lang.String.class);
errorText.value = (java.lang.String) _call.convertOutputParam("", "errorText", java.lang.String.class);
severity.value = (java.lang.String) _call.convertOutputParam("", "severity", java.lang.String.class);
errorType.value = (java.lang.String) _call.convertOutputParam("", "errorType", java.lang.String.class);
}
public void retraitEquipementServMoCA(java.lang.String noCompteClient, java.lang.String noSerie, java.lang.String typeAppareil, java.lang.String systemeSource, javax.xml.rpc.holders.StringHolder errorNb, javax.xml.rpc.holders.StringHolder errorText, javax.xml.rpc.holders.StringHolder severity, javax.xml.rpc.holders.StringHolder errorType) throws java.rmi.RemoteException {
lotus.domino.websvc.client.Call _call = createCall("retraitEquipementServMoCA");
java.lang.Object _resp = _call.invoke(new java.lang.Object[] {noCompteClient, noSerie, typeAppareil, systemeSource});
errorNb.value = (java.lang.String) _call.convertOutputParam("", "errorNb", java.lang.String.class);
errorText.value = (java.lang.String) _call.convertOutputParam("", "errorText", java.lang.String.class);
severity.value = (java.lang.String) _call.convertOutputParam("", "severity", java.lang.String.class);
errorType.value = (java.lang.String) _call.convertOutputParam("", "errorType", java.lang.String.class);
}
}
我不知道您是否需要更多信息,但是如果需要,我會添加它們。
我已經使用SoapUI成功連接到Web服務,因此我知道它可以在提供程序端使用。
代碼正在運行Domino版本9.0.1FP4 HF525
好吧,我設法找到了解決方案,它就在我的鼻子下面。
如果您查看“ JMP 105 – XML和Web服務快速入門”幻燈片(可在此處找到: http : //www.nnsu.com/nnsusite.nsf/xsp/.ibmmodres/domino/OpenAttachment/nnsusite.nsf/6343B286B9778CE6862576B60062BB1F /Content/JMP105.pdf ),其中有幾張幻燈片告訴您在何處添加憑據。 沒什么,您只需要將它們添加到Designer要從您要使用的Web服務的WSDL文件生成的存根代碼中即可。 對於LotusScript,它在第114頁上;對於Java,它在第120頁上。
這解決了我的問題!!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.