最近正在学习wcf,java平台、android、mac都要调用,今天先弄个java调用测试下。
一、创建WCF


namespace YourNamespace { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IHello”。 [ServiceContract(Namespace = "http://xxx.com/")] public interface IHello { [OperationContract] string SayHello(string words); [OperationContract] string Test(); } }


namespace YourNamespace { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Hello”。 public class Hello : IHello { public string SayHello(string words) { return "hello " + words; } public string Test() { return "test wcf"; } } }


<%@ ServiceHost Language="C#" Debug="true" Service="YourNamespace.Hello" CodeBehind="Hello.svc.cs" %>


<?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <serviceHostingEnvironment> <serviceActivations > <add relativeAddress="Hello.svc" service="YourNamespace.Hello"/> </serviceActivations > </serviceHostingEnvironment > <bindings> <basicHttpBinding> <binding name="BasicHttpBindingCfg" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> </binding> </basicHttpBinding> </bindings> <services> <service name="YourNamespace.Hello" behaviorConfiguration="ServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:90/Hello"/> </baseAddresses> </host> <endpoint binding="basicHttpBinding" contract="YourNamespace.IHello"> <identity> <dns value="localhost" /> </identity> </endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> <system.web> <compilation debug="true" /> </system.web> </configuration>
二、Java客户端调用
1.下载ksoap2 下载地址 http://code.google.com/p/ksoap2-android/
2.创建Java项目添加该类


package com.xx.wcftest; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; /** * 调用wcf服务类 * @author awei * */ public class SoapService { /** * wcf服务命名空间 */ protected String NameSpace = "http://xxx.com/";//可从配置文件读取 /** * wcf 服务地址 */ protected String URL = "http://localhost:90/";//可从配置文件读取 /** * wcf soap 方法执行地址,可从wsdl中获取 */ protected String SOAP_ACTION; /** * 功能名称 */ protected String MethodName; /** * 构造器初始化参数 * @param svc 服务寄宿文件名称 如:Hello.svc * @param ServiceInterface 服务接口名称 如:IHello */ public SoapService(String svc,String ServiceInterface) { this.URL += svc; this.SOAP_ACTION = this.NameSpace + ServiceInterface + "/"; } /** * 调用wcf方法返回结果 * @param method 要调用的方法名称 * @param map 要调用的方法参数字典 * @return */ public SoapObject LoadResult(String method,Map<String, Object> map) { this.MethodName = method; SoapObject soapObject = new SoapObject(NameSpace, MethodName); if(map != null && map.size() != 0){ Iterator<Entry<String, Object>> iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry<String,Object> entry = iter.next(); soapObject.addProperty(entry.getKey().toString(),entry.getValue()); } } SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); // 版本 envelope.bodyOut = soapObject; envelope.dotNet = true; envelope.setOutputSoapObject(soapObject); HttpTransportSE trans = new HttpTransportSE(URL); trans.debug = true; // 使用调试功能 try { trans.call(SOAP_ACTION + this.MethodName, envelope); System.out.println("Call Successful!"); } catch (Exception e) { System.out.println("IOException"); e.printStackTrace(); } SoapObject result = (SoapObject) envelope.bodyIn; return result; } }
3.调用服务


public class HelloWcfTest { public static void main(String[] args) { //1.创建服务对象 SoapService service = new SoapService("Hello.svc","IHello"); Map<String, Object> map = new HashMap<String, Object>(); map.put("words", "awei");//SayHello方法的参数 SoapObject result = service.LoadResult("SayHello", map); System.out.println("WCF Test返回的数据是:" + result.getProperty(0)); result = service.LoadResult("SayHello", null); System.out.println("WCF Test返回的数据是:" + result.getProperty(0)); } }