构建RESTful风格的WCF服务
RESTful Wcf是一种基于Http协议的服务架构风格。 相较 WCF、WebService 使用 SOAP、WSDL、WS-* 而言,几乎所有的语言和网络平台都支持 HTTP 请求。
RESTful的几点好处:
1、简单的数据通讯方式,基于HTTP协议。避免了使用复杂的数据通讯方式。
2、避免了复杂的客户端代理。
3、直接通过URI资源定向即可把服务暴露给调用者。
下面使用一个简单的demo项目来看看啥是RESTful Wcf。
1、项目结构【VS2010+.net 4.0】:
2、接口定义:定义了2个方法,分别代表GET、POST典型请求方式。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.ServiceModel; 6 using System.ServiceModel.Web; 7 using MyWcfService.Model; 8 namespace MyWcfService 9 { 10 [ServiceContract(Namespace = ServiceEnvironment.ServiceNamespace, Name = "user")] 11 public interface IUserService 12 { 13 /// <summary> 14 /// 根据code获取对象(GET请求处理) 15 /// </summary> 16 /// <param name="code"></param> 17 /// <returns></returns> 18 [OperationContract] 19 [WebGet(UriTemplate = "search/{code}", ResponseFormat = ServiceEnvironment.WebResponseFormat, RequestFormat = ServiceEnvironment.WebRequestFormat, BodyStyle = ServiceEnvironment.WebBodyStyle)] 20 UserInfo GetUserInfoSingle(string code); 21 22 /// <summary> 23 /// 注册新的用户(POST请求处理) 24 /// </summary> 25 /// <param name="user">注册用户信息</param> 26 /// <returns>注册成功返回注册用户基本信息</returns> 27 [OperationContract] 28 [WebInvoke(Method = "POST", UriTemplate = "register", ResponseFormat = ServiceEnvironment.WebResponseFormat, RequestFormat = ServiceEnvironment.WebRequestFormat, BodyStyle = ServiceEnvironment.WebBodyStyle)] 29 UserInfo Register(UserInfo user); 30 } 31 }
3、服务实现类WcfUserService:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Runtime.Serialization; 5 using System.ServiceModel; 6 using System.ServiceModel.Web; 7 using System.Text; 8 using MyWcfService.Model; 9 using System.ServiceModel.Activation; 10 11 namespace MyWcfService 12 { 13 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 14 public class WcfUserService : IUserService 15 { 18 public UserInfo GetUserInfoSingle(string code) 19 { 20 // var request= WebOperationContext.Current.IncomingRequest;
//测试数据 21 IList<UserInfo> list = new List<UserInfo>() 22 { 23 new UserInfo(){ Id=1, Code="000001", Name="乔峰", Description="乔大爷啊"}, 24 new UserInfo(){ Id=2, Code="600000", Name="段誉", Description="你爹真是风流倜傥啊"} 25 new UserInfo(){ Id=3, Code="000002", Name="慕容复", Description="妹子被楼上的抢咯,太失败了"}, 26 new UserInfo(){ Id=4, Code="000008", Name="庄聚贤", Description="无所事事的帅哥庄聚贤"} 27 }; 28 return list.Where(e => e.Code == code).FirstOrDefault(); 29 }
32 public UserInfo Register(UserInfo user) 33 { 34 if (user == null) 35 return null; 36 user.Description = "POST搞定了!"; 37 return user; 38 } 40 } 41 }
4、定义web资源请求和响应格式:
1 /// <summary> 2 /// web请求格式 3 /// </summary> 4 public const WebMessageFormat WebRequestFormat = WebMessageFormat.Xml; 5 6 /// <summary> 7 /// web相应格式 8 /// </summary> 9 public const WebMessageFormat WebResponseFormat = WebMessageFormat.Xml; 10 11 12 /// <summary> 13 /// 请求内容封装方式 14 /// </summary> 15 public const WebMessageBodyStyle WebBodyStyle = WebMessageBodyStyle.Bare;
5、Global全局资源文件,注册服务的路由:
1 protected void Application_Start(object sender, EventArgs e) 2 { 3 RegisterRoutes(); 4 } 5 6 private static void RegisterRoutes() 7 { 8 RouteTable.Routes.Add(new ServiceRoute("user", new WebServiceHostFactory(), GetServiceType("WcfUserService"))); 9 } 10 11 private static Type GetServiceType(string typeName) 12 { 13 string typeFullName = String.Format("MyWcfService.{0},MyWcfService", typeName); 14 return Type.GetType(typeFullName); 15 }
6、wcf配置文件:
1 <system.serviceModel> 2 <bindings> 3 <netTcpBinding> 4 <binding name="defaultNetTcpBinding" closeTimeout="00:01:00" 5 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 6 transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 7 hostNameComparisonMode="StrongWildcard" listenBacklog="10" 8 maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="100" 9 maxReceivedMessageSize="2147483647"> 10 <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 11 maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 12 <reliableSession ordered="true" inactivityTimeout="00:10:00" 13 enabled="false" /> 14 <security mode="None"> 15 <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 16 <message clientCredentialType="Windows" /> 17 </security> 18 </binding> 19 </netTcpBinding> 20 </bindings> 21 <behaviors> 22 <serviceBehaviors> 23 24 <behavior name="defaultResultBehavior"> 25 <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 --> 26 <serviceMetadata httpGetEnabled="true"/> 27 <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 --> 28 <serviceDebug includeExceptionDetailInFaults="true"/> 29 <dataContractSerializer maxItemsInObjectGraph="6553500"/> 30 </behavior> 31 </serviceBehaviors> 32 <endpointBehaviors> 33 <behavior name="defaultRestEndpointBehavior"> 34 <webHttp helpEnabled="true" automaticFormatSelectionEnabled="true" /> 35 <dataContractSerializer maxItemsInObjectGraph="6553500"/> 36 </behavior> 37 <behavior> 38 <dataContractSerializer maxItemsInObjectGraph="6553500"/> 39 </behavior> 40 </endpointBehaviors> 41 </behaviors> 42 <services> 43 <service name="MyWcfService.WcfUserService" behaviorConfiguration="defaultResultBehavior"> 44 <endpoint contract="MyWcfService.IUserService" binding="webHttpBinding" behaviorConfiguration="defaultRestEndpointBehavior" /> 45 </service> 46 47 </services> 48 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 49 </system.serviceModel>
文件代码都准备的差不多了,运行服务看下效果:
调用GET方法,返回xml数据:
ok,一个RestFul WCF就搭建完毕。
下一篇文章还是基于这个demo,如何使用dynamic解析Http RestFul xml格式响应数据,并展现在客户端。