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就搭建完毕。


喜欢
顶
难过
囧
围观
无聊





