服务器端的WebService类,同时也是客户端类(因为有main方法以及测试的代码)
package webservice;
import javax.xml.namespace.QName;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPElement;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.message.SOAPHeader;
import org.apache.axis.message.SOAPHeaderElement;
public class Power
{
public static String GetMessage()
{
return "调用成功!";
}
public static void main(String... a) throws Exception
{
String endpoint = "http://localhost:9000/hg/services/Power";
SOAPHeaderElement headerElement = new SOAPHeaderElement("http://schemas.xmlsoap.org/soap/envelope/", "sessionInfo");
headerElement.setMustUnderstand(false);
headerElement.addNamespaceDeclaration("soap", "http://schemas.xmlsoap.org/soap/envelope/");
SOAPElement sid = headerElement.addChildElement("sessionId");
sid.addTextNode("1234567890ABCDEF1234567890ABCDEF");
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName(new QName("GetMessage", "GetMessage"));
// call.addParameter(new QName("http://cn.zuoguodang.service", "name"),
// org.apache.axis.encoding.XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.SOAP_STRING);
// 设定 Header
call.addHeader(headerElement);
System.out.println(call.invoke(new Object[] {}));
}
}
服务器端的SoapHeader类
package webservice;
import java.util.Iterator;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import org.apache.axis.AxisFault;
import org.apache.axis.Message;
import org.apache.axis.MessageContext;
import org.apache.axis.message.MessageElement;
import org.apache.axis.message.SOAPEnvelope;
import org.apache.axis.message.SOAPHeaderElement;
public class Soapheader extends org.apache.axis.handlers.BasicHandler
{
private String sessionId;
@Override
public void invoke(MessageContext msgContext) throws AxisFault
{
boolean processedHeader = false;
String headerName = null;
try
{
// 取得 Request 的 SOAP 信息
Message msg = msgContext.getRequestMessage();
SOAPEnvelope envelope = msg.getSOAPEnvelope();
SOAPHeader header = envelope.getHeader();
Iterator it = header.examineAllHeaderElements();
SOAPHeaderElement hel;
while (it.hasNext())
{
hel = (SOAPHeaderElement) it.next();
headerName = hel.getNodeName();
if (headerName.equals("sessionInfo"))
{
// 对于 mustUnderstand 设为 true 的 Header,必须
// 利用下列的方式把它设为"已经处理",否则 service
// 会回传 Did not understand "MustUnderstand"
hel.setProcessed(true);
checkUser(hel);
processedHeader = true;
}
}
}
catch (SOAPException e)
{
throw new AxisFault("无法处理 SOAP Header.", e);
}
if (!processedHeader) { throw new AxisFault("接收 SOAP Header 失败"+headerName); }
}
private void checkUser(SOAPHeaderElement hel) throws AxisFault
{
MessageElement fele = hel.getChildElement(new QName("", "sessionId"));
if (fele == null) { throw new AxisFault("找不到 sessionId 标签."); }
sessionId = fele.getValue();
if (!"12345".equals(sessionId)) { throw new AxisFault("认证失败"); }
}
}
因为是使用axis2 webservice,所以要修改server-config.wsdd,增加SoapHeader作为handler,放在根节点下面
<handler name="Authenticate" type="java:webservice.Soapheader" />
并在globalConfiguration/requestFlow下面再增加节点:
<handler type="Authenticate"/>
c# 来调用这个服务的话,先生成代理类,然后在生成的代理类里面增加一个属性:
public CredentialSoapHeader SoapHeaderValue;
然后在需要调用的webserice方法上加注释:
[System.Web.Services.Protocols.SoapHeaderAttribute("SoapHeaderValue")]
CredentialSoapHeader类代码如下:
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "")]
[System.Xml.Serialization.XmlRootAttribute("sessionInfo", Namespace = "", IsNullable = false)]
public class CredentialSoapHeader : System.Web.Services.Protocols.SoapHeader
{
public string sessionId;
}
调用webservice并使用soapheader的代码如下:
PowerService sps = new PowerService();
CredentialSoapHeader cs = new CredentialSoapHeader();
cs.sessionId = "12345";
sps.SoapHeaderValue = cs;
Response.Write(sps.GetMessage());