1. 构建服务端程序
using System.ServiceModel;
namespace yournamespace
{
[ServiceContract(Name = " HelloService ", Namespace = " http://www.master.haku ")]
public interface IHello
{
[OperationContract]
string SayHello();
}
}
namespace yournamespace
{
[ServiceContract(Name = " HelloService ", Namespace = " http://www.master.haku ")]
public interface IHello
{
[OperationContract]
string SayHello();
}
}
namespace YourNameSpace
{
public class YourService
{
public string SayHello( string words)
{
return " Hello " + words;
}
}
}
{
public class YourService
{
public string SayHello( string words)
{
return " Hello " + words;
}
}
}
2. 构建IIS网站宿主
YourService.svc
<%
@ServiceHost Debug
=
"
true
"
Service
=
"
YourNameSpace.YourService
"
%>
Web.config
<?
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 >
< 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
package junit.soap.wcf;
import org.ksoap2.serialization.SoapObject;
public interface ISoapService {
SoapObject LoadResult();
}
import org.ksoap2.serialization.SoapObject;
public interface ISoapService {
SoapObject LoadResult();
}
HelloService
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;
}
}
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;
}
}
测试程序
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));
}
}
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客户端测试
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));
}
});
}
}
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));
}
});
}
}
7. 最后运行结果