C#调用Java jaxws开发的webservice服务
1、jaxws是基于wsdl国际标准基于xml传输协议,数据交互都基于标准xml格式,如果格式不正确交互会失败;关于jaxws整合spring并增加访问权限口令验证这里不再说明。
2、这里讲述开发注意事项、口令验证、数据加密(暂未涉及)、java服务端与C#客户的权限验证和数据交互;
3、C#如何调用java jaxws开发webservice服务呢?
参考文档:http://www.cnblogs.com/iamlilinfeng/archive/2012/09/25/2700049.html
在C#中新建WCF项目,并新建WCF测试webservice【WCF是基于标准wsdl协议】,如果通过WCF协议测试通过后,表示C#和java交互正常【测试之前关闭java saohandler验证】;WCF链接webservice只是做测试还没涉及安全验证
4、java服务端加入soaphandle验证,c#发送口令和消息,以下是C#客户端关键代码:
C#新建文件:
MySoapClient.cs 负责发送数据:
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Xml;
using System.Runtime.InteropServices;
using System.Configuration;
/// <summary>
/// 重新实现soap客户端
/// </summary>
public class MySoapClient
{
private System.Net.HttpWebRequest m_Client = null;
private string xmlTemplate = string.Empty;
private XmlDocument m_Dom = new XmlDocument();
/// <summary>
/// 用户名及密码
/// </summary>
public static string UserName = "TOKEpcinf&Amdocs123";//用户名及密码【在服务端将获取到该属性,验证用户口令】
/// <summary>
/// webservice地址
/// </summary>
public static string RequestUrl = @"http://192.168.2.106:9090/slhb2.0/AngleService?wsdl";
private static string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" >"
+ " <soapenv:Header>"
+ " <ns1:username soapenv:actor=\"http://schemas.xmlsoap.org/soap/actor/next\" soapenv:mustUnderstand=\"0\" xmlns:ns1=\"Authorization\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">TOKEpcinf</ns1:username>"
+ " <ns2:password soapenv:actor=\"http://schemas.xmlsoap.org/soap/actor/next\" soapenv:mustUnderstand=\"0\" xmlns:ns2=\"Authorization\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">Amdocs123</ns2:password>"
+ " </soapenv:Header>"
+ " <soapenv:Body xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>"
+ " <{0} xmlns='http://jaxws.webservice.mapscience.com/'>"
+ " <arg0 xmlns=''>hiloAngle123</arg0>" //这里参数标签必须是[arg0,arg1,arg.....],否则服务端接收不了值
+ " </{0}>"
+ " </soapenv:Body>"
+ " </soapenv:Envelope>";
/// <summary>
/// 默认构造函数
/// </summary>
public MySoapClient(string methodName)
{
m_Dom.LoadXml(string.Format(xml, methodName));
m_Client = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(RequestUrl);
m_Client.Method = "POST";
m_Client.Headers["SOAPAction"] = @""""""; //双引号
m_Client.ContentType = "text/xml; charset=utf-8";
m_Client.Accept = "application/dime, multipart/related, text/*,application/soap+xml";
m_Client.UserAgent = "Jaxws/2.0";
m_Client.Headers["Cache-Control"] = "no-cache";
m_Client.Headers["Pragma"] = "no-cache";
}
/ <summary>
/ 默认构造函数
/ </summary>
//public MySoapClient(string path)
//{
// m_Dom.LoadXml(xml);
// m_Client = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(path);
// m_Client.Method = "POST";
// m_Client.Headers["SOAPAction"] = @""""""; //双引号
// m_Client.ContentType = "text/xml; charset=utf-8";
// m_Client.Accept = "application/dime, multipart/related, text/*,application/soap+xml";
// m_Client.UserAgent = "Axis/1.4";
// m_Client.Headers["Cache-Control"] = "no-cache";
// m_Client.Headers["Pragma"] = "no-cache";
//}
/// <summary>
/// 发送webservice请求
/// </summary>
/// <param name="path">webservice地址</param>
/// <param name="functionname">函数名称</param>
/// <param name="xml">xml报文</param>
/// <returns></returns>
public string SendRequest(string xml)
{
try
{
//加入用户名及密码
XmlNode header = m_Dom.ChildNodes[1].ChildNodes[0];
XmlNode body = m_Dom.ChildNodes[1].ChildNodes[1];
header.ChildNodes[0].InnerText = UserName;
header.ChildNodes[1].InnerText = "";
body.ChildNodes[0].ChildNodes[0].InnerText = xml;
string sendXml = m_Dom.OuterXml;
Console.WriteLine(" XML报文== " + sendXml);
return send(sendXml);
}
catch (Exception ex)
{
return "加入用户名及密码 异常: " + ex.Message;
}
}
private string send(string data)
{
try
{
//【发送】
m_Client.ContentLength = data.Length;
System.IO.Stream sendStread = m_Client.GetRequestStream();
byte[] sendData = new ASCIIEncoding().GetBytes(data);
sendStread.Write(sendData, 0, sendData.Length);
sendStread.Close();
//【接收】
System.Net.HttpWebResponse myResponse = (System.Net.HttpWebResponse)m_Client.GetResponse();
System.IO.StreamReader reader = new System.IO.StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
string content = reader.ReadToEnd();
XmlDocument xd = new XmlDocument();
xd.LoadXml(content);
return xd.DocumentElement.InnerText;
}
catch (System.Net.WebException exp)
{
System.Net.WebResponse wr = exp.Response;
System.IO.StreamReader esr = new System.IO.StreamReader(wr.GetResponseStream(), Encoding.UTF8);
string Error = esr.ReadToEnd();
esr.Close();
return "不可预知异常: " + Error + ",系统:" + exp.Message;
}
}
}
新建GET.cs 负责拼接发送的参数:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Data;
namespace WindowsXML
{
internal class GET
{
private static XmlDocument NewXml()
{
XmlDocument xmlBack = new XmlDocument();
xmlBack.AppendChild(xmlBack.CreateXmlDeclaration("1.0", "UTF-8", null));
xmlBack.AppendChild(xmlBack.CreateElement("DBSET"));
XMLHelper.AddNewNode(xmlBack, "DBSET", "R", "C", "", "");
return xmlBack;
}
public static bool CheckDataTable(List<string[]> tab)
{
try
{
if (tab != null && tab.Count > 0)
{
string str = "";
for (int i = 0; i < tab.Count; i++)
{
str += tab[i].ToString();
}
return str.Length > 0;
}
return false;
}
catch (Exception)
{
return false;
}
}
public static bool CheckDataTable(DataTable tab)
{
try
{
if (tab != null && tab.Rows.Count > 0)
{
string str = "";
for (int i = 0; i < tab.Columns.Count; i++)
{
str += tab.Rows[0][i].ToString();
}
return str.Length > 0;
}
return false;
}
catch (Exception)
{
return false;
}
}
public static bool CheckReMsg(string str)
{
if (str != null && str.IndexOf("不可预知异常") == -1)
{
XmlDocument xdoc = new XmlDocument();
try
{
xdoc.LoadXml(str);
//if (xdoc.DocumentElement.Attributes[0].Name != "RESULT")
//{
// return false;
//}
//else
if (xdoc.DocumentElement.Attributes[0].Value == "0")
{
return true;
}
else if (xdoc.DocumentElement.Attributes[0].Value == "1")
{
XmlNode no = xdoc.DocumentElement.ChildNodes[0];
for (int i = 0; i < no.ChildNodes.Count; i++)
{
if (no.ChildNodes[i].Attributes[0].Value.Equals("RETURN_FLAG") && no.ChildNodes[i].InnerText.Equals("0"))
{
return true;
}
}
return false;
}
}
catch (Exception)
{
return false;
}
}
return false;
}
public static string ZuCan(string[] strnames, string[] strparms)
{
StringBuilder strtitle = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?><DBSET>");
string strrow = "<C N=\"{0}\">{1}</C>";
strtitle.Append("<R>");
for (int j = 0; strparms != null && j < strnames.Length; j++)
{
strtitle.Append(string.Format(strrow, strnames[j], strparms[j]));
}
strtitle.Append("</R>");
strtitle.Append("</DBSET>");
return strtitle.ToString();
}
public static string ZuCan(string[] strs, DataTable dt)
{
StringBuilder strtitle = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?><DBSET>");
string strrow = "<C N=\"{0}\">{1}</C>";
for (int i = 0; dt != null && i < dt.Rows.Count; i++)
{
strtitle.Append("<R>");
for (int j = 0; j < strs.Length; j++)
{
strtitle.Append(string.Format(strrow, strs[j], dt.Rows[i][strs[j]] == null ? "" : dt.Rows[i][strs[j]].ToString()));
}
strtitle.Append("</R>");
}
strtitle.Append("</DBSET>");
return strtitle.ToString();
}
public static string ZuCan(string[] strs, List<string[]> listparms)
{
StringBuilder strtitle = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?><DBSET>");
string strrow = "<C N=\"{0}\">{1}</C>";
for (int i = 0; listparms != null && i < listparms.Count; i++)
{
strtitle.Append("<R>");
for (int j = 0; j < strs.Length; j++)
{
strtitle.Append(string.Format(strrow, strs[j], listparms[i][j].ToString()));
}
strtitle.Append("</R>");
}
strtitle.Append("</DBSET>");
return strtitle.ToString();
}
}
}
新建XMLHelper.cs 负责拼接xml:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
namespace WindowsXML
{
public class XMLHelper
{
/// <summary>
/// XML格式返回
/// </summary>
/// <param name="xmlPara">xml</param>
/// <returns></returns>
public static XmlDocument LoadXmlFormatResult(string xmlPara)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlPara);
return xmlDoc;
}
/// <summary>
/// 通过节点名称获取节点集合
/// </summary>
/// <param name="xmlDoc">XML格式文档</param>
/// <param name="Name">节点名称</param>
/// <returns></returns>
public static List<XmlNode> GetXmlNodesByName(XmlDocument xmlDoc, string name)
{
List<XmlNode> xmlNode = new List<XmlNode>();
if (xmlDoc == null)
{
return xmlNode;
}
if (xmlDoc.DocumentElement.Name.ToString().ToLower() == name.ToLower())
{
xmlNode.Add((XmlNode)xmlDoc.DocumentElement);
}
XmlNodeList xmlNodeList = xmlDoc.DocumentElement.ChildNodes;
foreach (XmlNode xn in xmlNodeList)
{
GetNodesByName(xmlNode, xn, name);
}
return xmlNode;
}
public static XmlDocument BaseXML(string filename)
{
if (filename == null && filename == "")
{
filename = "Config.xml";
}
XmlDocument xdoc = new XmlDocument();
if (System.IO.File.Exists(filename))
{
try
{
xdoc.Load(filename);
return xdoc;
}
catch (Exception)
{
System.IO.File.Copy(filename, filename + ".非法的XML文件");
System.IO.File.Delete(filename);
}
}
xdoc.AppendChild(xdoc.CreateXmlDeclaration("1.0", "UTF-8", null));
xdoc.AppendChild(xdoc.CreateElement("DBSET"));
xdoc.DocumentElement.AppendChild(xdoc.CreateNode(XmlNodeType.Element, "R", null));
return xdoc;
}
/// <summary>通过 节点名称 获取 节点
/// </summary>
/// <param name="name">节点名称</param>
/// <returns></returns>
public static List<XmlNode> GetNodesByName(XmlDocument xdoc, string name)
{
List<XmlNode> list = new List<XmlNode>();
if (xdoc == null)
{
return list;
}
if (xdoc.DocumentElement.Name.ToString().ToLower() == name.ToLower())
list.Add((XmlNode)xdoc.DocumentElement);
XmlNodeList nlst = xdoc.DocumentElement.ChildNodes;
foreach (XmlNode xns in nlst)
{
GetNodesByName(list, xns, name);
}
return list;
}
public static void GetNodesByName(List<XmlNode> list, XmlNode node, string name)
{
if (node.Name.ToString().ToUpper() == name.ToUpper())
{
list.Add(node);
}
foreach (XmlNode xns in node.ChildNodes)
{
GetNodesByName(list, xns, name);
}
}
/// <summary>通过 节点属性值获取 节点
/// </summary>
/// <param name="name">属性值</param>
/// <returns></returns>
public static List<XmlNode> GetNodeByAttribute(XmlDocument xdoc, string name)
{
List<XmlNode> list = new List<XmlNode>();
if (xdoc == null)
{
return list;
}
for (int i = 0; xdoc.DocumentElement.Attributes != null && i < xdoc.DocumentElement.Attributes.Count; i++)
{
if (xdoc.DocumentElement.Attributes[i].Value.ToString().ToLower() == name.ToLower())
list.Add((XmlNode)xdoc.DocumentElement);
}
foreach (XmlNode xns in xdoc.DocumentElement.ChildNodes)
{
GetNodeByAttribute(list, xns, name);
}
return list;
}
public static void GetNodeByAttribute(List<XmlNode> list, XmlNode node, string name)
{
for (int i = 0; node.Attributes != null && i < node.Attributes.Count; i++)
{
if (node.Attributes[i].Value.ToString().ToLower() == name.ToLower())
list.Add(node);
}
foreach (XmlNode xns in node.ChildNodes)
{
GetNodeByAttribute(list, xns, name);
}
}
public static void AddNode(XmlNode nodeParent, XmlNode newChild, string pn)
{
if (nodeParent.Name == pn)
{
nodeParent.AppendChild(newChild.Clone());
}
foreach (XmlNode xns in nodeParent.ChildNodes)
{
AddNode(xns, newChild, pn);
}
}
public static void AddNode(XmlNode nodeParent, XmlNode newChild)
{
if (nodeParent == null || newChild == null)
{
return;
}
nodeParent.AppendChild(newChild);
}
/// <summary>添加新的节点,不理会是否有重复
/// </summary>
/// <param name="Pname">父节点名称 R</param>
/// <param name="Cname">要添加的节点的名称 P</param>
/// <param name="Aname">属性名 N </param>
/// <param name="attvalue">属性值</param>
/// <param name="innertext">节点值</param>
/// <returns></returns>
public static void AddNewNode(XmlDocument xdoc, string Pname, string Cname, string Aname, string attvalue, string innertext)
{
XmlNode newNode = xdoc.CreateNode(XmlNodeType.Element, Cname, null);
if (innertext != null)
{
newNode.InnerText = innertext;
}
if (attvalue != null && attvalue != "")
{
XmlNode newAtt = xdoc.CreateNode(XmlNodeType.Attribute, Aname, null);
newAtt.Value = attvalue;
newNode.Attributes.SetNamedItem(newAtt);
}
if (xdoc.DocumentElement.Name == Pname)
{
xdoc.DocumentElement.AppendChild(newNode.Clone());
}
XmlNodeList nlst = xdoc.DocumentElement.ChildNodes;
foreach (XmlNode xns in nlst)
{
AddNode(xns, newNode, Pname);
}
}
/// <summary>修改节点
/// </summary>
/// <param name="Cname">节点名称</param>
/// <param name="Aname">要修改的属性</param>
/// <param name="attvalue">新的属性值</param>
/// <param name="innertext">新的节点值</param>
public static void UpdateNode(XmlDocument xdoc, string Cname, string Aname, string attvalue, string innertext)
{
List<XmlNode> list = GetNodesByName(xdoc, Cname);
if (list != null && list.Count > 0)
{
foreach (XmlNode node in list)
{
node.InnerText = innertext;
if (node.Attributes[Aname] == null)
{
XmlNode newAtt = xdoc.CreateNode(XmlNodeType.Attribute, Aname, null);
newAtt.Value = attvalue;
node.Attributes.SetNamedItem(newAtt);
}
else
{
node.Attributes[Aname].Value = attvalue;
}
}
}
}
/// <summary>修改节点
/// </summary>
/// <param name="node">要修改的节点</param>
/// <param name="Aname">要修改的属性</param>
/// <param name="attvalue">新的属性值</param>
/// <param name="innertext">新的节点值</param>
public static void UpdateNode(XmlDocument xdoc, XmlNode node, string Aname, string attvalue, string innertext)
{
node.InnerText = innertext;
if (node.Attributes[Aname] == null)
{
XmlNode newAtt = xdoc.CreateNode(XmlNodeType.Attribute, Aname, null);
newAtt.Value = attvalue;
node.Attributes.SetNamedItem(newAtt);
}
else
{
node.Attributes[Aname].Value = attvalue;
}
}
/// <summary>修改或添加节点
/// </summary>
/// <param name="Pname">父节点名称 R</param>
/// <param name="Cname">要添加的节点的名称 P</param>
/// <param name="Aname">属性名 N </param>
/// <param name="attvalue">属性值</param>
/// <param name="innertext">节点值</param>
/// <returns></returns>
public static void UpOrAddNode(XmlDocument xdoc, string Pname, string Cname, string Aname, string attvalue, string innertext)
{
List<XmlNode> list = GetNodesByName(xdoc, Cname);
if (list != null && list.Count > 0)
{
foreach (XmlNode node in list)
{
node.InnerText = innertext;
if (node.Attributes[Aname] == null)
{
XmlNode newAtt = xdoc.CreateNode(XmlNodeType.Attribute, Aname, null);
newAtt.Value = attvalue;
node.Attributes.SetNamedItem(newAtt);
}
else
{
node.Attributes[Aname].Value = attvalue;
}
}
}
else
{
XmlNode newNode = xdoc.CreateNode(XmlNodeType.Element, Cname, null);
newNode.InnerText = innertext;
if (attvalue != null && attvalue != "")
{
XmlNode newAtt = xdoc.CreateNode(XmlNodeType.Attribute, Aname, null);
newAtt.Value = attvalue;
newNode.Attributes.SetNamedItem(newAtt);
}
if (xdoc.DocumentElement.Name == Pname)
{
xdoc.DocumentElement.AppendChild(newNode.Clone());
}
XmlNodeList nlst = xdoc.DocumentElement.ChildNodes;
foreach (XmlNode xns in nlst)
{
AddNode(xns, newNode, Pname);
}
}
}
/// <summary>删除节点
/// </summary>
/// <param name="node"></param>
public static void DelNode(XmlDocument xdoc, XmlNode node)
{
node.ParentNode.RemoveChild(node);
}
#region 去重
public static void QuChong(XmlDocument xdoc)
{
QuChongByNode((XmlNode)xdoc.DocumentElement);
}
public static void QuChong(XmlDocument xdoc, string nodename)
{
List<XmlNode> list = GetNodesByName(xdoc, nodename);
if (list != null)
{
foreach (XmlNode node in list)
{
QuChongByNode(node);
}
}
}
private static void QuChongByNode(XmlNode node)
{
foreach (XmlNode cn in node.ChildNodes)
{
QuChongByNode(cn);
}
for (int i = 1; node.ChildNodes.Count > 1 && i < node.LastChild.ParentNode.ChildNodes.Count; i++)
{
if (node.LastChild.ParentNode.ChildNodes[i].InnerXml.Equals(node.FirstChild.InnerXml))
{
node.LastChild.ParentNode.RemoveChild(node.LastChild);
i = -1;
}
}
}
#endregion
<summary>保存新的XML文件
</summary>
<param name="fileName">文件路径</param>
<returns></returns>
public static bool Save(XmlDocument xdoc, string fileName)
{
try
{
if (fileName != null && fileName.Length > 4)
{
xdoc.Save(fileName);
}
return true;
}
catch (Exception)
{
return false;
}
}
}
}
C#测试代码,改代码向java服务端发送handler验证和数据,服务端并返回接口:
//安全认证
private void button4_Click(object sender, EventArgs e)
{
// string[] value = { "1210128117200033090203", "1201" };
// string[] name = { "Jaxw安全认证", "area" };
// string param = WindowsXML.GET.ZuCan(value, name);
// Console.WriteLine(param);
MySoapClient my = new MySoapClient("angels");//angels是java的方法名
anglelabel.Text = my.SendRequest("12323") + "\r\n";
Console.WriteLine(anglelabel.Text); } 5、java jaxwshandle验证代码://anglelabel.Text = my.SendRequest(param) + "\r\n";
package com.mapscience.webservice.jaxws.handler; import java.util.Set; import java.io.IOException; import java.util.Iterator; import javax.servlet.http.HttpServletRequest; import javax.xml.namespace.QName; import javax.xml.soap.Node; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPFault; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; import javax.xml.ws.soap.SOAPFaultException; /** * <p> * Title: spring整合jaxws基于handler请求验证 * </p> * <p> * Description:当用户通过ws请求时,将会被本类进行拦截,并进行验证,只有合法用户才能访问 * </p> * <p> * Copyright: Copyright (c) 2014 * </p> * <p> * Company: * </p> * * @author 2014-1-1 * @version 1.0 * @Excample 【网上说在chain-handler.xml配置文件中配置拦截,但这个方式没成功】采样另一方式,在spring中配置: <bean * id="myHandler" * class="com.mapscience.webservice.jaxws.handler.TKHandler" /> * <servlet:binding url="/AngleService" > <servlet:service > * <core:service bean="#baseJaxws"> <core:handlers> <ref * bean="myHandler"/> </core:handlers> </core:service> * </servlet:service> </servlet:binding> * * */ public class TKHandler implements SOAPHandler<SOAPMessageContext> { public boolean handleMessage(SOAPMessageContext context) { System.out.println("请求被拦截."); Boolean outbound = (Boolean) context .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (!outbound.booleanValue()) { SOAPMessage soapMessage = context.getMessage(); try { SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope(); SOAPHeader soapHeader = soapEnvelope.getHeader(); System.out.println(soapHeader.getFirstChild()); if (soapHeader == null) { generateSoapFault(soapMessage, "No Message Header..."); } Iterator it = soapHeader .extractHeaderElements(SOAPConstants.URI_SOAP_ACTOR_NEXT); if (it == null || !it.hasNext()) { generateSoapFault(soapMessage, "No Header block for role next"); } Node node = (Node) it.next(); String value = node == null ? null : node.getValue(); if (value == null) { generateSoapFault(soapMessage, "No authation info in header blocks"); } String[] infos = value.split("&"); return authValidate(infos[0], infos[1]); } catch (SOAPException e) { e.printStackTrace(); } } return true; } private boolean authValidate(String userName, String password) { if (userName == null || password == null) { return false; } if ("admin".equals(userName) && "admin".equals(password)) { return true; } return false; } private void generateSoapFault(SOAPMessage soapMessage, String reasion) { try { SOAPBody soapBody = soapMessage.getSOAPBody(); SOAPFault soapFault = soapBody.getFault(); if (soapFault == null) { soapFault = soapBody.addFault(); } soapFault.setFaultString(reasion); throw new SOAPFaultException(soapFault); } catch (SOAPException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public boolean handleFault(SOAPMessageContext context) { System.out.println("Server : handleFault()......"); return true; } public void close(MessageContext context) { System.out.println("服务验证机制关闭."); } public Set<QName> getHeaders() { System.out.println("服务验证机制初始化."); return null; } private void generateSOAPErrMessage(SOAPMessage msg, String reason) { try { SOAPBody soapBody = msg.getSOAPPart().getEnvelope().getBody(); SOAPFault soapFault = soapBody.addFault(); soapFault.setFaultString(reason); throw new SOAPFaultException(soapFault); } catch (SOAPException e) { } } }
6、java webservice访问层:7、记住jaxws是基于wsdl国际标准xml数据传输,支持任何语言平台,发送的xml永远是如下格式,如果格式出错将接收不了数据:@WebService public class AngleJaxws { @WebMethod public String angels(String v) { return "服务器返回结果" + v+"->"+map; } }
private static string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" >" + " <soapenv:Header>" + " <ns1:username soapenv:actor=\"http://schemas.xmlsoap.org/soap/actor/next\" soapenv:mustUnderstand=\"0\" xmlns:ns1=\"Authorization\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">TOKEpcinf</ns1:username>" + " <ns2:password soapenv:actor=\"http://schemas.xmlsoap.org/soap/actor/next\" soapenv:mustUnderstand=\"0\" xmlns:ns2=\"Authorization\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">Amdocs123</ns2:password>" + " </soapenv:Header>" + " <soapenv:Body xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>" + " <angles xmlns='http://jaxws.webservice.mapscience.com/'>" //angles是服务端的方法名称 + " <arg0 xmlns=''>hiloAngle123</arg0>" //arg是方法参数【标签必须是arg0/arg1/arg2/arg....】,否则服务端接收参数为Null + " </angles>" + " </soapenv:Body>" + " </soapenv:Envelope>";