|
本帖最后由 Koson 于 2013-1-19 10:49 编辑
又是一周一次的周六了,小版主今天给大家分享一下WCF作为服务端返回数据的经验吧。由于时间有限,这篇帖子不会讲得很详细,只会涉及到相关的介绍和说明。加之刚刚在论坛看到有人发帖文如何解析json,所以就把这篇帖子分享一下哦。
1、WCF是什么?概念就不多说了,小版主之所以用WCF作为服务端,是因为它的确是非常强大的。至少现在于小版主而言,是如此的。(小版主的项目中,因为不仅仅涉及到Website,还涉及到CMS,同时也还涉及到移动平台(iPhone和Android),可想而知,这些平台都需要用到同一个数据库的数据,WCF在项目中就至关重要了,适应所有平台的需要。)。
2、EF是什么?是MS在 ado.net基础所发展出来的对象关系映射 (ORM)的一个强大实用的框架,哈哈,不管你是否是这样觉得,反正小版主是深有所感的。现在已经发展到了4.X的版本。至于能帮我们做什么,等会看看代码吧。
3、LINQ就不用多说了吧。相信大家也肯定接触过了。学习linq就先了解学习一下拉姆达表达式吧。那样子或许会更好理解,尽管说你写sql语句已经比较熟悉。
4、JSON,之所以成为最理想的数据交换语言。因为其轻巧便利,容易被解析、生成以及传递。其结构是名/值对得形式呈现,如:{'Name':'Koson','Age':'21'},想知道小版主得更多私人信息嘛?哈哈,那就看复杂一些得JSON呈现吧:{'Name':'Koson','Age':'21','MoreInfo':[{'Sex':'Man'},{'ChineseName':'Guo'},{'Developer Language':'C# OBJECTIVE-C'}]}
5、介绍了那么多了,但是因为涉及到得东西还是比较多,就不多讲了,直接看代码吧。
1)新建一个WCF的Project,而且小版主在发帖子得时候是在苹果得狮子系统上,也没有这个开发环境,就不能够截图演示了。
2)新建EDMX,可以使用向导使用你已经建好了的数据库,会自动生成你需要的,也可以使用CODE FIRST方式,新建你的数据库。
3)在此基础上,找到你的接口文件,打开。新增一个执行新增操作的方法吧。代码如下:- /// <summary>
- /// 功能简述:WCF Service
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/15
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- [ServiceContract]
- public interface IHKService
- {
- //功能简述:新增街道资讯资料
- //撰写人员:Konson
- //撰写日期:2012/10/19
- //修改人员:
- //修改日期:
- [WebInvoke(Method = "POST")]
- bool AddStreetInfo(StreetInfo streetinfo);
- }
复制代码 4)找到实现文件,对应写上刚刚定义的方法,代码如下:- /// <summary>
- /// 功能简述:WCF Service
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/15
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- [JavascriptCallbackBehavior(UrlParameterName = "jsoncallback")]
- public class LifeInHKService : ILifeInHKService
- {
- LifeInHKEntities entity = new LifeInHKEntities();
-
- /// <summary>
- /// 功能简述:新增街道资讯资料
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/19
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- public bool AddStreetInfo(StreetInfo streetinfo)
- {
- bool boolSuccess = true;
- entity.Connection.Open();
- var var_transaction = entity.Connection.BeginTransaction(IsolationLevel.Serializable);
- try
- {
- StreetInfo Streetinfo = new StreetInfo();
- Streetinfo.name = streetinfo.name;
- Streetinfo.description = streetinfo.description;
- Streetinfo.imageUrl = streetinfo.imageUrl;
- Streetinfo.lastupdatetime = streetinfo.lastupdatetime;
- entity.StreetInfo.AddObject(Streetinfo);
- entity.SaveChanges();
- var_transaction.Commit();
- }
- catch {
- boolSuccess = false;
- var_transaction.Rollback();
- }
- finally {
- var_transaction.Dispose();
- entity.Connection.Close();
- }
- return boolSuccess;
- }
复制代码 其中AddStreetInfo(StreetInfo streetinfo)方法主要是实现新增一条数据,此方法参数使用的是一个实体对象StreetInfo,而且方法中也有使用事务。entity.StreetInfo.AddObject(Streetinfo);AddObject()方法就是新增的方法,最后还需要提交 entity.SaveChanges();才真正的执行了保存操作呢。
5)修改和删除操作其实也就差不多很简单了,直接看代码吧,接口文件里写上:- /// <summary>
- /// 功能简述:更新街道资讯资料
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/19
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- bool UpdateStreetInfo(StreetInfo streetinfo);
- /// <summary>
- /// 功能简述:刪除街道资讯资料
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/19
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- bool DeleteStreetInfo(int intID);
复制代码 6)实现文件代码:- /// <summary>
- /// 功能简述:更新街道资讯资料
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/19
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- public bool UpdateStreetInfo(StreetInfo streetinfo)
- {
- bool boolSuccess = true;
- entity.Connection.Open();
- var var_transaction = entity.Connection.BeginTransaction(IsolationLevel.Serializable);
- try
- {
- var var_StreetInfo = from s in entity.StreetInfo
- where s.id == streetinfo.id
- select s;
- foreach (var v in var_StreetInfo)
- {
- v.name = streetinfo.name;
- v.description = streetinfo.description;
- if (streetinfo.imageUrl != null && streetinfo.imageUrl != "")
- {
- v.imageUrl = streetinfo.imageUrl;
- }
- v.lastupdatetime = streetinfo.lastupdatetime;
- }
- entity.SaveChanges();
- var_transaction.Commit();
- }
- catch
- {
- boolSuccess = false;
- var_transaction.Rollback();
- }
- finally
- {
- var_transaction.Dispose();
- entity.Connection.Close();
- }
- return boolSuccess;
- }
- /// <summary>
- /// 功能简述:刪除街道资讯资料
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/19
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- public bool DeleteStreetInfo(int intID)
- {
- bool boolSuccess = true;
- entity.Connection.Open();
- var var_transaction = entity.Connection.BeginTransaction(IsolationLevel.Serializable);
- try
- {
- var var_StreetInfo = entity.StreetInfo.SingleOrDefault(s => s.id == intID );
- entity.StreetInfo.DeleteObject(var_StreetInfo);
- entity.SaveChanges();
- var_transaction.Commit();
- }
- catch
- {
- boolSuccess = false;
- var_transaction.Rollback();
- }
- finally
- {
- var_transaction.Dispose();
- entity.Connection.Close();
- }
- return boolSuccess;
- }
复制代码 也有使用到了事务哦,时间问题,具体就不多做介绍了,有问题的地方可以直接与小版主交流哦,QQ或者Email我吧。
7)最后是一个查询操作哦,接口文件代码:- /// <summary>
- /// 功能简述:获取全部街道资讯资料
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/19
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- [OperationContract]
- //[WebGet]
- [WebInvoke(Method="GET",RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
- string GetStreetInfoAll();
- /// <summary>
- /// 功能简述:根据ID获取街道资讯资料
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/19
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- [OperationContract]
- //[WebGet]
- [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
- string GetStreetInfoByID(int intID);
复制代码 8)实现文件代码:- /// <summary>
- /// 功能简述:获取全部街道资讯资料
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/15
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- public string GetStreetInfoAll()
- {
- List<StreetInfo> list = new List<StreetInfo>();
- var var_list = from s in entity.StreetInfo select s;
- foreach (var v in var_list)
- {
- list.Add(v);
- }
- list.ForEach(e => entity.Detach(e));
- var var_str = list.Select(e => GetNonEntityPropertyValues(e));
- string strJson = ServiceStack.Text.JsonSerializer.SerializeToString(var_str);
- return strJson;
- }
- /// <summary>
- /// 功能简述:根据ID获取街道资讯资料
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/15
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- public string GetStreetInfoByID(int intID)
- {
- var var_list = from s in entity.StreetInfo
- where s.id == intID
- select s;
- var list = var_list.ToList();
- list.ForEach(e => entity.Detach(e));
- var var_str = list.Select(e => GetNonEntityPropertyValues(e));
- string strJson = ServiceStack.Text.JsonSerializer.SerializeToString(var_str);
- return strJson;
- }
复制代码 9)对于这个linq的写法其实和sql还是很相似的,之前说过,了解一下拉姆达表达式对于理解非常有帮助。其到底又多强大和方法,不妨试一试写一写体会一下便知。熟悉它还是需要经常反复的使用。以后的博文再一起分析吧。
10)代码中可以看到这么一句 string strJson = ServiceStack.Text.JsonSerializer.SerializeToString(var_str);其实这个是讲其序列化成json的一个操作,用到了一个dll,因为好似不能上传这个dll,所以就不分享了,可以去网上下载,如果有需要,也可以直接QQ我或者Email我,我也可以传给你(ServiceStack.Text.dll)。
11)最后值得一说的便是这一行代码了:var var_str = list.Select(e => GetNonEntityPropertyValues(e));因为在数据库各表之间有些主外键或者其它因素,便导致这个list生成的结果并非我们所需要的,带上了一些properties,如EntityKey之类,给你做解析带来了非常的不便。如下所示:- {"d":"[{"id":1,"normal_fare":"全線空調","air_cond_fare":9.8,","EntityKey":{"EntitySetName":"bus_stop","EntityContainerName":"TrafficCheckEntities","EntityKeyValues":[{"Key":"id","Value":1}]}},
复制代码 其实我需要的结果是这样的:- {"d":"[{"id":1,"normal_fare":"全線空調","air_cond_fare":9.8,"}
复制代码 对于这个问题我在国内的网站论坛是没有找到什么解决的办法的。最后是一个香港的同事给我提供了一个方法,就是GetNonEntityPropertyValues()这个方法了。代码如下:- /// <summary>
- /// 功能简介:在result當中,有幾個properties如EntityKey等無需要的properties,為了拿走這些properties請加入這個function
- /// 撰写人员:Kenny...
- /// 撰写日期:2012/6/27
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- public IDictionary<string, object> GetNonEntityPropertyValues(object obj)
- {
- var dictionary = new Dictionary<string, object>();
- foreach (var property in obj.GetType().GetProperties())
- {
- var propertyValue = property.GetValue(obj, null);
- if (!property.Name.Contains("Entity") && !property.Name.Contains("Reference"))
- {
- dictionary.Add(property.Name, propertyValue);
- }
- }
- return dictionary;
- }
复制代码 12)至于在需要调用WCF的程序里,得到这个json如何解析呢?可以使用Newtonsoft.Json.dll,- /// <summary>
- /// 功能简述:綁定每週街道資訊Store
- /// 撰写人员:Konson
- /// 撰写日期:2012/09/15
- /// 修改人员:
- /// 修改日期:
- /// </summary>
- private void BindStroe()
- {
- string strUrl = "http://localhost:53224/HK.svc/GetXXXXAll";
- string strJson= WebRequestExtensions.GetJsonFromUrl(strUrl);
- JObject jobject = JObject.Parse(strJson);
- var var_store = JArray.Parse(jobject["d"].ToString());
- StoreStreetInfo.DataSource = var_store;
- StoreStreetInfo.DataBind();
- }
复制代码 记得下载Newtonsoft.Json.dll 引入项目并且引入命名空间哦。
13)好了,分享就到这里了吧。有问题就和小版主一起交流吧。
|
|