| 
 二:生成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;         } 
    } 
注意第一句话    [AspNetCompatibilityRequirements(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,注意<system.serviceModel>节点上加这句: 
   <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
在 
      <behaviors>         <endpointBehaviors>           <behavior name="RestMemberServiceBehavior">            <webHttp />           </behavior>         </endpointBehaviors> 
注意加红变粗的地方。差不多就注意这几个地方,具体看我范例的配置吧。 
出处:蓝色理想
 
责任编辑:bluehearts 
上一页 C# 3.5 WCF REST架构简单网站 [1] 下一页 C# 3.5 WCF REST架构简单网站 [3] 
◎进入论坛网络编程版块参加讨论
	       |