ITPub博客

首页 > 大数据 > 数据分析 > WCF REST架构简单网站

WCF REST架构简单网站

数据分析 作者:当当小牛 时间:2011-04-04 14:33:00 0 删除 编辑
以前在微软的平台,架构一个网站,需要传统的数据库处理代码,业务逻辑层代码,前端的页面处理,还有交互程序处理这几部分的紧密结合,可以说解耦比较困难。网站开发的难度高,更新成本的难度也就高了。就我经验来说,一个简单的网站必须是一个可扩展,易跨平台数据复用,易维护的架构。我在这里抛砖引玉的说说我使用的架构:数据库 +REST Server+WEB(MVC?) 在下面的文字我尽量少做细节描述,把我目前的做法和大家分享一下就是了。

工具/原料

  • 在MS平台上的,数据库是MS SQL2008 .NET3.5+VS2008,首先建立数据模型,然后生成DataContext(数据库处理层),然后使用WCF生成REST风格的Web Service,然后再在网站使用Web Service做页面的处理,对应的网站动态数据交互,以后可以考虑使用MSMQ做消息,然后异步的关心Web Service的Cache等,这是后话,以后有机会再和大家交流。

步骤/方法

  1. 1
    数据库的操作
    前我经常用工厂模式去做,后来发现在大中网站基本用不了那么复杂的逻辑,因为数据库的架构基本上是万古不变的,所以我直接使用C#3.5的Dlinq ,在效率,维护成本上都要高出c#2.0的传统做法的实现。
    OK,用VS2008 创建一个项目 DbDomain,然后新建一个Linq To Sql类,然后在服务器资源管理器链接数据库,找到表,拖过来。就OK了。具体的代码在附件有。数据库的结构是:
    如上,是两张简单的表,会员表和文章表。
    直接修改数据库后,然后再如上步骤即可,对应的*DataContext文件都基本上是固定的格式,有兴趣的自己去深入研究。
  2. 2
    生成RSET 风格的Web Service
    为什么需要Web Service,主要是考虑复用,缓存,数据之间的EVENT通知,还有调试维护等,至于为什么要生成REST风格的,不明白的请自觉GG之,当然,不是每个方法的实现都用REST风格的,对于安全级别比较高的,我还是会使用传统的生成的wsdl web service去安排设计。这里这些暂时不会考虑。
    新建一个wcf 应用程序WcfService,创建一个wcf服务Member.svc,范例中只实现了对会员的简单查询和录入:先看看IMember的实现:
    namespace WcfService
    {
    // 注意: 如果更改此处的接口名称 "IMember",也必须更新 Web.config 中对 "IMember" 的引用。
    [ServiceContract]
    public interface IMember
    {
    [OperationContract]
    [WebGet(UriTemplate = "User/{id}", ResponseFormat = WebMessageFormat.Json)]
    User GetUser(string id);
    [OperationContract]
    [WebInvoke(UriTemplate = "User/{name}/{password}", ResponseFormat = WebMessageFormat.Xml,Method = "POST")]
    int AddUser(string name,string password);
    }
    }
    注意第一行标注[ServiceContract]这是一个可转换的Service,3.5大部分是这种模式,接下来是[OperationContract]操作方法,相当于asmx的类似于webmethod的这种标注,然后[WebGet(UriTemplate = "User/{id}", ResponseFormat = WebMessageFormat.Json)]这就是表示访问路径与相应的格式。我们期望在应用程序访问http://localhost/member.svc/User/1,能相应Json格式的User数据。这里的User我并没有数据的Member,因为敏感数据控制,缓存等考虑,中间做了一层,专用跨平台交互:
    [DataContract]
    public class User
    {
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string Name{ get; set; }
    }
    在dlinq查询是非常的方便的,例如看看具体的实现:
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Member : IMember
    {
    public User GetUser(string id)
    {
    DbDomain.TestDbHandlerDataContext dc=new DbDomain.TestDbHandlerDataContext();
    return (from x in dc.Member where x.Id.ToString().Equals(id) select new User { Id = x.Id, Name = x.Name }).FirstOrDefault();
    }
    public int AddUser(string name, string password)
    {
    if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(password)) return -1;
    DbDomain.TestDbHandlerDataContext dc = new DbDomain.TestDbHandlerDataContext();
    DbDomain.Member clsMember = new DbDomain.Member();
    clsMember.Name = name;
    clsMember.Password = password;
    dc.Member.InsertOnSubmit(clsMember);
    dc.SubmitChanges();
    return clsMember.Id;
    }
    }
    etCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]标注,是指明在IIS里访问该service。这里我没有做cache等,是直接操作数据库的,dlinq操作数据之前,都会建立一个 DbDomain.TestDbHandlerDataContext dc = new DbDomain.TestDbHandlerDataContext();查询类。查询和更新都需要,语法也是很规范的linq,完全不会出现native sql或者dataset这些东西,全部是模型对象的处理,话外DataContext注意每次使用new的,不要使用static的。
    注意,如果要让你的svc是REST风格的,除了上面的UriTemplate以外,还要修改svc的标注,加上这句:
    Factory="System.ServiceModel.Activation.WebServiceHostFactory"
    修改web.Config,注意节点上加这句:








    注意加红变粗的地方。差不多就注意这几个地方,具体看我范例的配置吧。
    然后再http://localhost:3274/Member.svc/User/1 这样的去访问,就会返回json格式的数据:
    添加数据库的方法就是用POST的方式:
    var usern = client.UploadString("http://localhost:3274/Member.svc/User/admin/admin", "POST",String.Empty);
    Console.WriteLine(usern);
    可以成功的POST数据,然后返回新用户的ID。
  3. 3
    使用web service开发网站
    网站的与数据的交互开发就是使用上面的web service,注意,这里的rest风格的web service就是没有wsdl,需要post数据,然后自己序列化,一般都是公开数据字典,直接序列化,3.5已经自带序列化System.ServiceModel.Web(在 System.ServiceModel.Web.dll 中),所以不再用json.net等第三方的类折腾了:
    我在范例网站抽取了我常用的一段代码,在方法 private T CoreRequest(string url, object objdata, string mt)
    中,
    var u = CoreRequest("http://localhost:3274/Member.svc/User/1", null, "GET");
    if(u!=null){
    Response.Write(u.Name);
    }
    就OK 了。
    END

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23977475/viewspace-1110542/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-05-25

最新文章