现在的位置: 首页 > 综合 > 正文

andoird + wcf开发实例

2013年09月22日 ⁄ 综合 ⁄ 共 8927字 ⁄ 字号 评论关闭

实例开发架构: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.

 

 

 

抱歉!评论已关闭.