Android 调用WCF实例
1. 构建服务端程序
1 2 3 4 5 6 7 8 9 10 11 12 13 | using System.ServiceModel; namespace yournamespace { [ServiceContract(Name = "HelloService" , Namespace = "http://www.master.haku" )] public interface IHello { [OperationContract] string SayHello(); } } <br> |
1 2 3 4 5 6 7 8 9 10 | namespace YourNameSpace { public class YourService { public string SayHello(string words) { return "Hello " + words; } } } |
2. 构建IIS网站宿主
YourService.svc
<%@ServiceHost Debug="true" Service="YourNameSpace.YourService"%>
Web.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | <?xml version= "1.0" encoding= "utf-8" ?> <configuration> <system.serviceModel> <serviceHostingEnvironment> <serviceActivations > <add relativeAddress= "YourService.svc" service= "YourNameSpace.YourService" /> </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.YourService" behaviorConfiguration= "ServiceBehavior" > <host> <baseAddresses> <add baseAddress= "http://localhost:59173/YourService" /> </baseAddresses> </host> <endpoint binding= "basicHttpBinding" contract= "YourNameSpace.你的服务契约接口" > <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> |
3. 寄宿服务
把网站发布到web服务器, 指定网站虚拟目录指向该目录
如果你能够访问http://你的IP:端口/虚拟目录/服务.svc
那么,恭喜你,你的服务端成功了!
4. 使用ksoap2调用WCF
去ksoap2官网
http://code.google.com/p/ksoap2-android/ 下载最新jar
5. 在Eclipse中新建一个Java项目,测试你的服务
新建一个接口, 用于专门读取WCF返回的SoapObject对象
ISoapService
1 2 3 4 5 6 7 8 9 | package junit.soap.wcf; import org.ksoap2.serialization.SoapObject; public interface ISoapService { SoapObject LoadResult(); } <br> |
HelloService
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | package junit.soap.wcf; import java.io.IOException; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import org.xmlpull.v1.XmlPullParserException; public class HelloService implements ISoapService { private static final String NameSpace = "http://www.master.haku" ; private static final String URL = "http://你的服务器/虚拟目录/你的服务.svc" ; private static final String SOAP_ACTION = "http://www.master.haku/你的服务/SayHello" ; private static final String MethodName = "SayHello" ; private String words; public HelloService(String words) { this .words = words; } public SoapObject LoadResult() { SoapObject soapObject = new SoapObject(NameSpace, MethodName); soapObject.addProperty( "words" , words); 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, envelope); System.out.println( "Call Successful!" ); } catch (IOException e) { System.out.println( "IOException" ); e.printStackTrace(); } catch (XmlPullParserException e) { System.out.println( "XmlPullParserException" ); e.printStackTrace(); } SoapObject result = (SoapObject) envelope.bodyIn; return result; } } |
测试程序
1 2 3 4 5 6 7 8 9 10 11 12 | package junit.soap.wcf; import org.ksoap2.serialization.SoapObject; public class HelloWcfTest { public static void main(String[] args) { HelloService service = new HelloService( "Master HaKu" ); SoapObject result = service.LoadResult(); System.out.println( "WCF返回的数据是:" + result.getProperty( 0 )); } } |
经过测试成功
运行结果:
Hello Master HaKu
6. Android客户端测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | package david.android.wcf; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import org.ksoap2.serialization.SoapObject; public class AndroidWcfDemoActivity extends Activity { private Button mButton1; private TextView text; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); mButton1 = (Button) findViewById(R.id.myButton1); text = (TextView) this .findViewById(R.id.show); mButton1.setOnClickListener( new Button.OnClickListener() { @Override public void onClick(View v) { HelloService service = new HelloService( "Master HaKu" ); SoapObject result = service.LoadResult(); text.setText( "WCF返回的数据是:" + result.getProperty( 0 )); } }); } } <br> |
7. 最后运行结果
安卓调用Webservice和Java稍有不同,利用的是ksoap2这个jar包。之前这个jar包是发布在googlecode上面的目前项目已经移动到了github.io,我这里贴上的github官方网站,我也不知道这个github.io和github.com是不是一回事。我们可以在以下页面看到项目的总览:http://simpligility.github.io/ksoap2-android/index.html。
1.下载ksoap2jar包
在如下页面进行下载:https://oss.sonatype.org/content/repositories/ksoap2-android-releases/com/google/code/ksoap2-android/ksoap2-android-assembly/
ksoap2项目的源码在这里,有兴趣的可以弄下来研究哦:
https://github.com/simpligility/ksoap2-android/
2.在Android Studio中进行配置
这一步简单,先放到lib文件夹下,然后再lib上点击右键,选择ADD AS LIB就可以了哦
3.利用网上的服务,自动生成ksoap2可用的webservice的客户端代理类
打开http://www.wsdl2code.com/pages/Home.aspx页面,在页面的右边填入你的webService的访问地址,然后选择生成的方式,我选的是Android Using kSoap2.如果你的webservice还没有发布,也可以直接上传其wsdl文件。
点击submit,此时要求登录,如果没有账号就注册一个,然后登陆,稍等一会这个工具就会为我们自动生成Webservice客户端代理类的代码了,点击下载
当然,自动生成的没有与jar运行环境啊什么的,可能使用的时候有些问题,至少包命名就得改成你自己的,所以,我们再简单的修改一下这些代码就可以直接使用了,省去了我们手动写客户端代理类的麻烦,是不是很方便啊。