使用分布式编程,很方便不同编程语言之间互相访问,但也必须注意一些技术细节,实现起来才能畅通无阻,取得事半功倍的效果。
首先,创建一个WCF。使用原有网站或新建一个网站,并将端口动态改为固定,如设成8000。在网站中添加WCF服务,取名字为:GetAccountService.svc,这时同时生成了一个接口:IGetAccountService.cs和一个实现类:GetAccountService.cs,并且有一个默认方法。我们为了测试对数据库的访问,将方法改为:GetAccount。
完成的代码如下:
1.IGetAccountService.cs
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; // 注意: 如果更改此处的接口名称 "IGetAccountService",也必须更新 Web.config 中对 "IGetAccountService" 的引用。 [ServiceContract] public interface IGetAccountService { [OperationContract] Account GetAccount(String username); }
2.GetAccountService.cs
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using System.Data; using System.Data.SqlClient; // 注意: 如果更改此处的类名 "GetAccountService",也必须更新 Web.config 中对 "GetAccountService" 的引用。 public class GetAccountService : IGetAccountService { public Account GetAccount(String username) { String dbconn = global::System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; String sqlString = "SELECT userId, userName FROM UserAccount where userName='" + username + "'"; Account account = new Account(); using (SqlConnection conn = new SqlConnection(dbconn)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = sqlString; SqlDataReader rd = cmd.ExecuteReader(); if (rd.Read()) { account.Userid = Convert.ToInt32(rd["userId"]); account.Username = rd["userName"].ToString(); } } return account; } }
3.代码涉及到一个Account对象:
using System; using System.Data; using System.Linq; /// <summary> ///Account 的摘要说明 /// </summary> public class Account { private int m_userid; private String m_username; public Account() { // //TODO: 在此处添加构造函数逻辑 // } public int Userid { get{ return m_userid;} set { m_userid = value; } } public String Username { get { return m_username; } set { m_username = value; } } }
这时,右击GetAccountService.svc选择“在浏览器中查看”,可以看到服务已经运行,并且也打印出了访问服务的URL:“http://localhost:8000/WebWcf/GetAccountService.svc?wsdl”这个时候如果用.net来访问服务是没有问题的,但是如果用Java访问还是不行。程序上并没有错误,只是协议有点小问题。必须将Web.config中的wsHttpBinding改为:basicHttpBinding才行:
<system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="GetAccountServiceBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="GetAccountServiceBehavior" name="GetAccountService"> <endpoint address="" binding="basicHttpBinding" contract="IGetAccountService"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> </system.serviceModel>
好了,现在可以用Java访问了。Java的访问工具比较好用的还是axis,可以到网上下载。有了axis后,可以编写一个脚本,用来生成一些基本代码。例如编写如下一个脚本,并存为wcf.bat文件:
其中的lib为axis工具包中的lib目录,它包含了需要用到的Jar。在Dos下运行wcf.bat,即在当前目录中创建了目录wcf,并生成了五个Java程序,代码分别为:
1. BasicHttpBinding_IGetAccountServiceStub.java
代码 /** * BasicHttpBinding_IGetAccountServiceStub.java * * This file was auto-generated from WSDL * by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter. */ package wcf; public class BasicHttpBinding_IGetAccountServiceStub extends org.apache.axis.client.Stub implements wcf.IGetAccountService { private java.util.Vector cachedSerClasses = new java.util.Vector(); private java.util.Vector cachedSerQNames = new java.util.Vector(); private java.util.Vector cachedSerFactories = new java.util.Vector(); private java.util.Vector cachedDeserFactories = new java.util.Vector(); static org.apache.axis.description.OperationDesc [] _operations; static { _operations = new org.apache.axis.description.OperationDesc[3]; _initOperationDesc1(); } private static void _initOperationDesc1(){ org.apache.axis.description.OperationDesc oper; org.apache.axis.description.ParameterDesc param; oper = new org.apache.axis.description.OperationDesc(); oper.setName("GetAccountPass"); param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("http://tempuri.org/", "uname"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false); param.setOmittable(true); param.setNillable(true); oper.addParameter(param); oper.setReturnType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); oper.setReturnClass(java.lang.String.class); oper.setReturnQName(new javax.xml.namespace.QName("http://tempuri.org/", "GetAccountPassResult")); oper.setStyle(org.apache.axis.constants.Style.WRAPPED); oper.setUse(org.apache.axis.constants.Use.LITERAL); _operations[0] = oper; oper = new org.apache.axis.description.OperationDesc(); oper.setName("GetAccountName"); oper.setReturnType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); oper.setReturnClass(java.lang.String.class); oper.setReturnQName(new javax.xml.namespace.QName("http://tempuri.org/", "GetAccountNameResult")); oper.setStyle(org.apache.axis.constants.Style.WRAPPED); oper.setUse(org.apache.axis.constants.Use.LITERAL); _operations[1] = oper; oper = new org.apache.axis.description.OperationDesc(); oper.setName("GetAccount"); param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("http://tempuri.org/", "username"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false); param.setOmittable(true); param.setNillable(true); oper.addParameter(param); oper.setReturnType(new javax.xml.namespace.QName("http://schemas.datacontract.org/2004/07/", "Account")); oper.setReturnClass(wcf.Account.class); oper.setReturnQName(new javax.xml.namespace.QName("http://tempuri.org/", "GetAccountResult")); oper.setStyle(org.apache.axis.constants.Style.WRAPPED); oper.setUse(org.apache.axis.constants.Use.LITERAL); _operations[2] = oper; } public BasicHttpBinding_IGetAccountServiceStub() throws org.apache.axis.AxisFault { this(null); } public BasicHttpBinding_IGetAccountServiceStub(java.net.URL endpointURL, javax.xml.rpc.Service service) throws org.apache.axis.AxisFault { this(service); super.cachedEndpoint = endpointURL; } public BasicHttpBinding_IGetAccountServiceStub(javax.xml.rpc.Service service) throws org.apache.axis.AxisFault { if (service == null) { super.service = new org.apache.axis.client.Service(); } else { super.service = service; } ((org.apache.axis.client.Service)super.service).setTypeMappingVersion("1.2"); java.lang.Class cls; javax.xml.namespace.QName qName; javax.xml.namespace.QName qName2; java.lang.Class beansf = org.apache.axis.encoding.ser.BeanSerializerFactory.class; java.lang.Class beandf = org.apache.axis.encoding.ser.BeanDeserializerFactory.class; java.lang.Class enumsf = org.apache.axis.encoding.ser.EnumSerializerFactory.class; java.lang.Class enumdf = org.apache.axis.encoding.ser.EnumDeserializerFactory.class; java.lang.Class arraysf = org.apache.axis.encoding.ser.ArraySerializerFactory.class; java.lang.Class arraydf = org.apache.axis.encoding.ser.ArrayDeserializerFactory.class; java.lang.Class simplesf = org.apache.axis.encoding.ser.SimpleSerializerFactory.class; java.lang.Class simpledf = org.apache.axis.encoding.ser.SimpleDeserializerFactory.class; java.lang.Class simplelistsf = org.apache.axis.encoding.ser.SimpleListSerializerFactory.class; java.lang.Class simplelistdf = org.apache.axis.encoding.ser.SimpleListDeserializerFactory.class; qName = new javax.xml.namespace.QName("http://schemas.datacontract.org/2004/07/", "Account"); cachedSerQNames.add(qName); cls = wcf.Account.class; cachedSerClasses.add(cls); cachedSerFactories.add(beansf); cachedDeserFactories.add(beandf); } protected org.apache.axis.client.Call createCall() throws java.rmi.RemoteException { try { org.apache.axis.client.Call _call = super._createCall(); if (super.maintainSessionSet) { _call.setMaintainSession(super.maintainSession); } if (super.cachedUsername != null) { _call.setUsername(super.cachedUsername); } if (super.cachedPassword != null) { _call.setPassword(super.cachedPassword); } if (super.cachedEndpoint != null) { _call.setTargetEndpointAddress(super.cachedEndpoint); } if (super.cachedTimeout != null) { _call.setTimeout(super.cachedTimeout); } if (super.cachedPortName != null) { _call.setPortName(super.cachedPortName); } java.util.Enumeration keys = super.cachedProperties.keys(); while (keys.hasMoreElements()) { java.lang.String key = (java.lang.String) keys.nextElement(); _call.setProperty(key, super.cachedProperties.get(key)); } // All the type mapping information is registered // when the first call is made. // The type mapping information is actually registered in // the TypeMappingRegistry of the service, which // is the reason why registration is only needed for the first call. synchronized (this) { if (firstCall()) { // must set encoding style before registering serializers _call.setEncodingStyle(null); for (int i = 0; i < cachedSerFactories.size(); ++i) { java.lang.Class cls = (java.lang.Class) cachedSerClasses.get(i); javax.xml.namespace.QName qName = (javax.xml.namespace.QName) cachedSerQNames.get(i); java.lang.Object x = cachedSerFactories.get(i); if (x instanceof Class) { java.lang.Class sf = (java.lang.Class) cachedSerFactories.get(i); java.lang.Class df = (java.lang.Class) cachedDeserFactories.get(i); _call.registerTypeMapping(cls, qName, sf, df, false); } else if (x instanceof javax.xml.rpc.encoding.SerializerFactory) { org.apache.axis.encoding.SerializerFactory sf = (org.apache.axis.encoding.SerializerFactory) cachedSerFactories.get(i); org.apache.axis.encoding.DeserializerFactory df = (org.apache.axis.encoding.DeserializerFactory) cachedDeserFactories.get(i); _call.registerTypeMapping(cls, qName, sf, df, false); } } } } return _call; } catch (java.lang.Throwable _t) { throw new org.apache.axis.AxisFault("Failure trying to get the Call object", _t); } } public java.lang.String getAccountPass(java.lang.String uname) throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setOperation(_operations[0]); _call.setUseSOAPAction(true); _call.setSOAPActionURI("http://tempuri.org/IGetAccountService/GetAccountPass"); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS); _call.setOperationName(new javax.xml.namespace.QName("http://tempuri.org/", "GetAccountPass")); setRequestHeaders(_call); setAttachments(_call); try { java.lang.Object _resp = _call.invoke(new java.lang.Object[] {uname}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } else { extractAttachments(_call); try { return (java.lang.String) _resp; } catch (java.lang.Exception _exception) { return (java.lang.String) org.apache.axis.utils.JavaUtils.convert(_resp, java.lang.String.class); } } } catch (org.apache.axis.AxisFault axisFaultException) { throw axisFaultException; } } public java.lang.String getAccountName() throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setOperation(_operations[1]); _call.setUseSOAPAction(true); _call.setSOAPActionURI("http://tempuri.org/IGetAccountService/GetAccountName"); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS); _call.setOperationName(new javax.xml.namespace.QName("http://tempuri.org/", "GetAccountName")); setRequestHeaders(_call); setAttachments(_call); try { java.lang.Object _resp = _call.invoke(new java.lang.Object[] {}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } else { extractAttachments(_call); try { return (java.lang.String) _resp; } catch (java.lang.Exception _exception) { return (java.lang.String) org.apache.axis.utils.JavaUtils.convert(_resp, java.lang.String.class); } } } catch (org.apache.axis.AxisFault axisFaultException) { throw axisFaultException; } } public wcf.Account getAccount(java.lang.String username) throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setOperation(_operations[2]); _call.setUseSOAPAction(true); _call.setSOAPActionURI("http://tempuri.org/IGetAccountService/GetAccount"); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS); _call.setOperationName(new javax.xml.namespace.QName("http://tempuri.org/", "GetAccount")); setRequestHeaders(_call); setAttachments(_call); try { java.lang.Object _resp = _call.invoke(new java.lang.Object[] {username}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } else { extractAttachments(_call); try { return (wcf.Account) _resp; } catch (java.lang.Exception _exception) { return (wcf.Account) org.apache.axis.utils.JavaUtils.convert(_resp, wcf.Account.class); } } } catch (org.apache.axis.AxisFault axisFaultException) { throw axisFaultException; } } }
2. GetAccountService.java
/** * GetAccountService.java * * This file was auto-generated from WSDL * by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter. */ package wcf; public interface GetAccountService extends javax.xml.rpc.Service { public java.lang.String getBasicHttpBinding_IGetAccountServiceAddress(); public wcf.IGetAccountService getBasicHttpBinding_IGetAccountService() throws javax.xml.rpc.ServiceException; public wcf.IGetAccountService getBasicHttpBinding_IGetAccountService(java.net.URL portAddress) throws javax.xml.rpc.ServiceException; }
3. GetAccountServiceLocator.java
代码 /** * GetAccountServiceLocator.java * * This file was auto-generated from WSDL * by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter. */ package wcf; public class GetAccountServiceLocator extends org.apache.axis.client.Service implements wcf.GetAccountService { public GetAccountServiceLocator() { } public GetAccountServiceLocator(org.apache.axis.EngineConfiguration config) { super(config); } public GetAccountServiceLocator(java.lang.String wsdlLoc, javax.xml.namespace.QName sName) throws javax.xml.rpc.ServiceException { super(wsdlLoc, sName); } // Use to get a proxy class for BasicHttpBinding_IGetAccountService private java.lang.String BasicHttpBinding_IGetAccountService_address = "http://localhost:8000/WebWcf/GetAccountService.svc"; public java.lang.String getBasicHttpBinding_IGetAccountServiceAddress() { return BasicHttpBinding_IGetAccountService_address; } // The WSDD service name defaults to the port name. private java.lang.String BasicHttpBinding_IGetAccountServiceWSDDServiceName = "BasicHttpBinding_IGetAccountService"; public java.lang.String getBasicHttpBinding_IGetAccountServiceWSDDServiceName() { return BasicHttpBinding_IGetAccountServiceWSDDServiceName; } public void setBasicHttpBinding_IGetAccountServiceWSDDServiceName(java.lang.String name) { BasicHttpBinding_IGetAccountServiceWSDDServiceName = name; } public wcf.IGetAccountService getBasicHttpBinding_IGetAccountService() throws javax.xml.rpc.ServiceException { java.net.URL endpoint; try { endpoint = new java.net.URL(BasicHttpBinding_IGetAccountService_address); } catch (java.net.MalformedURLException e) { throw new javax.xml.rpc.ServiceException(e); } return getBasicHttpBinding_IGetAccountService(endpoint); } public wcf.IGetAccountService getBasicHttpBinding_IGetAccountService(java.net.URL portAddress) throws javax.xml.rpc.ServiceException { try { wcf.BasicHttpBinding_IGetAccountServiceStub _stub = new wcf.BasicHttpBinding_IGetAccountServiceStub(portAddress, this); _stub.setPortName(getBasicHttpBinding_IGetAccountServiceWSDDServiceName()); return _stub; } catch (org.apache.axis.AxisFault e) { return null; } } public void setBasicHttpBinding_IGetAccountServiceEndpointAddress(java.lang.String address) { BasicHttpBinding_IGetAccountService_address = address; } /** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException { try { if (wcf.IGetAccountService.class.isAssignableFrom(serviceEndpointInterface)) { wcf.BasicHttpBinding_IGetAccountServiceStub _stub = new wcf.BasicHttpBinding_IGetAccountServiceStub(new java.net.URL(BasicHttpBinding_IGetAccountService_address), this); _stub.setPortName(getBasicHttpBinding_IGetAccountServiceWSDDServiceName()); return _stub; } } catch (java.lang.Throwable t) { throw new javax.xml.rpc.ServiceException(t); } throw new javax.xml.rpc.ServiceException("There is no stub implementation for the interface: " + (serviceEndpointInterface == null ? "null" : serviceEndpointInterface.getName())); } /** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(javax.xml.namespace.QName portName, Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException { if (portName == null) { return getPort(serviceEndpointInterface); } java.lang.String inputPortName = portName.getLocalPart(); if ("BasicHttpBinding_IGetAccountService".equals(inputPortName)) { return getBasicHttpBinding_IGetAccountService(); } else { java.rmi.Remote _stub = getPort(serviceEndpointInterface); ((org.apache.axis.client.Stub) _stub).setPortName(portName); return _stub; } } public javax.xml.namespace.QName getServiceName() { return new javax.xml.namespace.QName("http://tempuri.org/", "GetAccountService"); } private java.util.HashSet ports = null; public java.util.Iterator getPorts() { if (ports == null) { ports = new java.util.HashSet(); ports.add(new javax.xml.namespace.QName("http://tempuri.org/", "BasicHttpBinding_IGetAccountService")); } return ports.iterator(); } /** * Set the endpoint address for the specified port name. */ public void setEndpointAddress(java.lang.String portName, java.lang.String address) throws javax.xml.rpc.ServiceException { if ("BasicHttpBinding_IGetAccountService".equals(portName)) { setBasicHttpBinding_IGetAccountServiceEndpointAddress(address); } else { // Unknown Port Name throw new javax.xml.rpc.ServiceException(" Cannot set Endpoint Address for Unknown Port" + portName); } } /** * Set the endpoint address for the specified port name. */ public void setEndpointAddress(javax.xml.namespace.QName portName, java.lang.String address) throws javax.xml.rpc.ServiceException { setEndpointAddress(portName.getLocalPart(), address); } }
4. IGetAccountService.java
代码 /** * IGetAccountService.java * * This file was auto-generated from WSDL * by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter. */ package wcf; public interface IGetAccountService extends java.rmi.Remote { public java.lang.String getAccountPass(java.lang.String uname) throws java.rmi.RemoteException; public java.lang.String getAccountName() throws java.rmi.RemoteException; public wcf.Account getAccount(java.lang.String username) throws java.rmi.RemoteException; }
5. Account.java
代码 /** * Account.java * * This file was auto-generated from WSDL * by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter. */ package wcf; public class Account implements java.io.Serializable { private java.lang.Integer userid; private java.lang.String username; public Account() { } public Account( java.lang.Integer userid, java.lang.String username) { this.userid = userid; this.username = username; } /** * Gets the userid value for this Account. * * @return userid */ public java.lang.Integer getUserid() { return userid; } /** * Sets the userid value for this Account. * * @param userid */ public void setUserid(java.lang.Integer userid) { this.userid = userid; } /** * Gets the username value for this Account. * * @return username */ public java.lang.String getUsername() { return username; } /** * Sets the username value for this Account. * * @param username */ public void setUsername(java.lang.String username) { this.username = username; } private java.lang.Object __equalsCalc = null; public synchronized boolean equals(java.lang.Object obj) { if (!(obj instanceof Account)) return false; Account other = (Account) obj; if (obj == null) return false; if (this == obj) return true; if (__equalsCalc != null) { return (__equalsCalc == obj); } __equalsCalc = obj; boolean _equals; _equals = true && ((this.userid==null && other.getUserid()==null) || (this.userid!=null && this.userid.equals(other.getUserid()))) && ((this.username==null && other.getUsername()==null) || (this.username!=null && this.username.equals(other.getUsername()))); __equalsCalc = null; return _equals; } private boolean __hashCodeCalc = false; public synchronized int hashCode() { if (__hashCodeCalc) { return 0; } __hashCodeCalc = true; int _hashCode = 1; if (getUserid() != null) { _hashCode += getUserid().hashCode(); } if (getUsername() != null) { _hashCode += getUsername().hashCode(); } __hashCodeCalc = false; return _hashCode; } // Type metadata private static org.apache.axis.description.TypeDesc typeDesc = new org.apache.axis.description.TypeDesc(Account.class, true); static { typeDesc.setXmlType(new javax.xml.namespace.QName("http://schemas.datacontract.org/2004/07/", "Account")); org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc(); elemField.setFieldName("userid"); elemField.setXmlName(new javax.xml.namespace.QName("http://schemas.datacontract.org/2004/07/", "Userid")); elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); elemField.setMinOccurs(0); elemField.setNillable(false); typeDesc.addFieldDesc(elemField); elemField = new org.apache.axis.description.ElementDesc(); elemField.setFieldName("username"); elemField.setXmlName(new javax.xml.namespace.QName("http://schemas.datacontract.org/2004/07/", "Username")); elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); elemField.setMinOccurs(0); elemField.setNillable(true); typeDesc.addFieldDesc(elemField); } /** * Return type metadata object */ public static org.apache.axis.description.TypeDesc getTypeDesc() { return typeDesc; } /** * Get Custom Serializer */ public static org.apache.axis.encoding.Serializer getSerializer( java.lang.String mechType, java.lang.Class _javaType, javax.xml.namespace.QName _xmlType) { return new org.apache.axis.encoding.ser.BeanSerializer( _javaType, _xmlType, typeDesc); } /** * Get Custom Deserializer */ public static org.apache.axis.encoding.Deserializer getDeserializer( java.lang.String mechType, java.lang.Class _javaType, javax.xml.namespace.QName _xmlType) { return new org.apache.axis.encoding.ser.BeanDeserializer( _javaType, _xmlType, typeDesc); } }
用上面代码可以用Eclipse创建一个Java测试工程,并将axis工具包Lib的Jar也导入工程中,再创建一个测试程序:ClientTest.java
package wcf; public class ClientTest { /** * @param args */ public static void main(String[] args) { try { GetAccountService client = new GetAccountServiceLocator(); Account account = new Account(); account = client.getBasicHttpBinding_IGetAccountService().getAccount("abc"); System.out.println("account="+account.getUserid()+";"+account.getUsername()); System.in.read(); } catch (Exception e) { System.out.println("Exception : " + e.getMessage()); } } }
确认WCF服务正在运行中,在Eclipse中打开上面程序,点击Run菜单,选择”Run as Java Application”,即可打印出运行结果: