实例开发架构:android调用wcf service服务(注意是service服务,不是restful风格,后面再讲restful风格的调用)。
动手之前,先一个ksoap2-android,它是我们调用wcf服务的工具。在官网上下载过好几次都不能用,后来发现原来下载的不是完整的。所以大家可以到这下载http://download.csdn.net/detail/leesmn/5162649。
wcf部分(使用的是VS2012):
1、新建wcf类库odbServiceLib。定义IService,以及定义数据约定
namespace odbServiceLib
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
[ServiceContract]
public interface IService
{
[OperationContract]
int PostDaignoseJson(string jsonStr);
[OperationContract]
string PostConsultJson(string jsonStr);
[OperationContract]
Consult GetConsult(string imei);
// TODO: 在此添加您的服务操作
}
// 使用下面示例中说明的数据约定将复合类型添加到服务操作。
// 可以将 XSD 文件添加到项目中。在生成项目后,可以通过命名空间“odbServiceLib.ContractType”直接使用其中定义的数据类型。
[DataContract]
public class Diagnose
{
[DataMember]
public string imei { get; set; }
[DataMember]
public double longitude { get; set; }
[DataMember]
public double latitude { get; set; }
[DataMember]
public string datetime { get; set; }
[DataMember]
public int type { get; set; }
[DataMember]
public string content { get; set; }
}
[DataContract]
public class Consult
{
[DataMember]
public string imei { get; set; }
[DataMember]
public double longitude { get; set; }
[DataMember]
public double latitude { get; set; }
[DataMember]
public string datetime { get; set; }
[DataMember]
public int type { get; set; }
[DataMember]
public string text { get; set; }
[DataMember]
public string imgstr { get; set; }
[DataMember]
public byte[] img1 { get; set; }
}
}
2、实现Service。在该段代码中本人用了vs自带的ado.net entity framwork作为orm操作数据库
namespace odbServiceLib
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
public class Service : IService
{
public int PostDaignoseJson(string jsonStr)
{
Diagnose d;
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonStr)))
{
DataContractJsonSerializer serializer1 = new DataContractJsonSerializer(typeof(Diagnose));
d = (Diagnose)serializer1.ReadObject(ms);
}
//System.Data.Common.DbTransaction tran = null;
int i = 0;
try
{
using (carobdEntities ctx = new carobdEntities())
{
ctx.Database.Connection.Open();
//tran = ctx.Database.Connection.BeginTransaction();
StringBuilder strb = new StringBuilder();
strb.Append("create table if not EXISTS diag");
strb.Append(d.imei);
strb.Append("(id int not null auto_increment,");
strb.Append("longitude double,");
strb.Append("latitude double,");
strb.Append("datetime datetime,");
strb.Append("type int,");
strb.Append("content varchar(500),");
strb.Append("PRIMARY KEY (id) )");
if (ctx.Database.ExecuteSqlCommand(strb.ToString()) > 0)
ctx.SaveChanges();
strb.Clear();
strb.Append("insert into diag");
strb.Append(d.imei);
strb.Append("(longitude,latitude,datetime,type,content)values(");
strb.Append(d.longitude);
strb.Append(",");
strb.Append(d.latitude);
strb.Append(",'");
strb.Append(d.datetime);
strb.Append("',");
strb.Append(d.type);
strb.Append(",'");
strb.Append(d.content);
strb.Append("')");
if (ctx.Database.ExecuteSqlCommand(strb.ToString()) > 0)
i = ctx.SaveChanges();
//tran.Commit();
}
}
catch { i = -1; }
return i;
}
public string PostConsultJson(string jsonStr)
{
Consult c;
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonStr)))
{
DataContractJsonSerializer serializer1 = new DataContractJsonSerializer(typeof(Consult));
c = (Consult)serializer1.ReadObject(ms);
}
c.img1 = Convert.FromBase64String(c.imgstr);
//System.Data.Common.DbTransaction tran = null;
int i = 0;
try
{
using (carobdEntities ctx = new carobdEntities())
{
ctx.Database.Connection.Open();
//tran = ctx.Database.Connection.BeginTransaction();
StringBuilder strb = new StringBuilder();
strb.Append("create table if not EXISTS cons");
strb.Append(c.imei);
strb.Append("(id int not null auto_increment,");
strb.Append("longitude double,");
strb.Append("latitude double,");
strb.Append("datetime datetime,");
strb.Append("type int,");
strb.Append("text varchar(500),");
strb.Append("img1 longblob,");
strb.Append("PRIMARY KEY (id) )");
if (ctx.Database.ExecuteSqlCommand(strb.ToString()) > 0)
ctx.SaveChanges();
strb.Clear();
strb.Append("insert into cons");
strb.Append(c.imei);
strb.Append("(longitude,latitude,datetime,type,text,img1)values(");
strb.Append(c.longitude);
strb.Append(",");
strb.Append(c.latitude);
strb.Append(",'");
strb.Append(c.datetime);
strb.Append("',");
strb.Append(c.type);
strb.Append(",'");
strb.Append(c.text);
strb.Append("',");
strb.Append("{0}");
strb.Append(")");
if (ctx.Database.ExecuteSqlCommand(strb.ToString(), c.img1) > 0)
i = ctx.SaveChanges();
//tran.Commit();
}
}
catch (Exception e) { i = -1; return e.Message; }
return i.ToString();
}
public Consult GetConsult(string imei)
{
Consult c = null;
try
{
using (carobdEntities ctx = new carobdEntities())
{
ctx.Database.Connection.Open();
//tran = ctx.Database.Connection.BeginTransaction();
StringBuilder strb = new StringBuilder();
strb.Append("select * from cons");
strb.Append(imei);
strb.Append(" order by id DESC limit 1");
c = ctx.Database.SqlQuery<Consult>(strb.ToString()).FirstOrDefault();
//tran.Commit();
}
}
catch (Exception e) { }
return c;
}
}
}
3、新建web-〉wcf服务。将默认生成的IService以及Service删除掉。将odbServiceLib 类库添加到本项目中。编辑Service.svc的标记
<%@ ServiceHost Language="C#" Debug="true" Service="odbServiceLib.Service" %>
到此wcf端就大功告成了运行一下看看能不能打开Service.svc
android部分:
1、确保已经将ksoap2-android加载到项目中
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://192.168.1.108:8082/Service.svc";
private static String METHOD_NAME = "";
private static String SOAP_ACTION = "";
public static String call(String methodName, String jsonStr) {
String restr = "";
METHOD_NAME = methodName;
SOAP_ACTION = "http://tempuri.org/IService/" + methodName;
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("jsonStr", jsonStr);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
// to get the data
restr = result.toString();
// 0 is the first object of data
// sb.append(resultData + "\n");
} catch (Exception e) {
restr = "Error:" + e.getMessage();
}
return restr;
}
private void PostDaignoseJson()
{
JSONObject object = new JSONObject();
try {
object.put("imei", phoneIMEI);
object.put("longitude", x);
object.put("latitude", y);
object.put("datetime", sdf.format(new Date()));
object.put("type", type);
object.put("content", diagData);
} catch (JSONException e) {
e.printStackTrace();
}
call("PostDaignoseJson", object.toString());
}
private void PostConsultJson(){
imgStr = new String(Base64.encode(imgBuf));
JSONObject object = new JSONObject();
try {
object.put("imei", phoneIMEI);
object.put("longitude", x);
object.put("latitude", y);
object.put("datetime", sdf.format(new Date()));
object.put("type", 1);
object.put("text", consData);
object.put("imgbase64", imgStr);
} catch (JSONException e) {
e.printStackTrace();
}
call("PostConsultJson", object.toString());
}
说明:对于上传图片的问题有点麻烦,不能之间将byte[]转为json,所以先将他Base64.encode编码为String.