RESTful WCF
发布日期:2021-06-29 03:54:38
浏览次数:3
分类:技术文章
本文共 5177 字,大约阅读时间需要 17 分钟。
REST 最近很热门……
WCF 3.5 增加了对 REST 的支持 —— System.ServiceModel.Web。对我而言 REST 并不是用来取代 WebService/WCF 的,它更多的是一种架构层面而非技术层面的概念和标准。使用唯一资源定位地址 URI,加上 HTTP 请求方法从而达到对一个发布于互联网资源的唯一描述和操作。这会带来很多好处:1. 资源的唯一性对下面这两个 URI 而言,搜索引擎会把它当作两个不相同的资源抓取,然后有可能被去重…… (这着实是件苦恼的事情)而使用 REST 进行表达,那么只有 "" 才是资源的唯一地址,我们可以使用 HTTP 方法 GET 请求信息,使用 DELETE 来删除。GET /product/123 HTTP/1.1DELETE /product/123 HTTP/1.12. 更好的交互集成能力相 较 WCF、WebService 使用 SOAP、WSDL、WS-* 而言,几乎所有的语言和网络平台都支持 HTTP 请求。我们无需去实现复杂的客户端代理,无需使用复杂的数据通讯方式既可以将我们的服务暴露给任何需要的人,无论他使用 VB、Ruby、JavaScript,甚至是 HTML FORM,或者直接在浏览器地址栏输入。这种方式是对外的,在内部具体的实现上,我们还是需要依赖某种特定的技术方案,包括我们今天要提到的 WCF 3.5 web。REST 看似简单,但却不是个浅白的话题。每个人都有自己的理解和使用方式,它的出现带来了一种新的希望。----- 迷糊的分割线 ---------------WCF 3.5 引入了 WebGetAttribute、WebInvokeAttribute、UriTemplate 来增加对 REST 的支持,这使得我们用很简单的方式就可以实现 RESTful WCF Service。 [DataContract] public class User { [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; } } [ServiceContract] public interface IMyService { [OperationContract] [WebInvoke(UriTemplate = "User/{name}/{age}", Method = "POST", ResponseFormat = WebMessageFormat.Json)] User CreateUser(string name, string age); [OperationContract] [WebGet(UriTemplate = "User/{name}", ResponseFormat = WebMessageFormat.Json)] //[WebInvoke(UriTemplate = "User/{name}", Method = "GET", // ResponseFormat = WebMessageFormat.Json)] User GetUser(string name); [OperationContract] [WebInvoke(UriTemplate = "User/{name}", Method = "DELETE", ResponseFormat = WebMessageFormat.Json)] string DeleteUser(string name); [OperationContract] [WebInvoke(UriTemplate = "User/{name}", Method = "PUT", ResponseFormat = WebMessageFormat.Json)] string UpdateUser(string name); } public class MyService : IMyService { public User GetUser(string name) { return new User { Name = name, Age = 12 }; } public string DeleteUser(string name) { return "DELETE..."; } public User CreateUser(string name, string age) { return new User { Name = name, Age = int.Parse(age) }; } public string UpdateUser(string name) { return "UPDATE..."; } } class Program { static void Main(string[] args) { var host = new WebServiceHost(typeof(MyService), new Uri("http://localhost:81")); host.Open(); var client = new WebClient(); client.Headers.Add("content-type", "application/x-www-form-urlencoded"); // POST /GetUser/tom/21 HTTP/1.1 var s1 = client.UploadString("http://localhost:81/User/tom/21", "POST", String.Empty); Console.WriteLine(s1); // GET /GetUser/tom HTTP/1.1 var s2 = client.DownloadString("http://localhost:81/User/tom"); Console.WriteLine(s2); // DELETE /GetUser/tom HTTP/1.1 var s3 = client.UploadString("http://localhost:81/User/tom", "DELETE", String.Empty); Console.WriteLine(s3); // PUT /All/tom HTTP/1.1 var s4 = client.UploadString("http://localhost:81/User/tom", "PUT", String.Empty); Console.WriteLine(s4); Console.WriteLine("Press any key to exit..."); Console.ReadKey(true); } }
输出:{"Age":21,"Name":"tom"}{"Age":12,"Name":"tom"}"DELETE...""UPDATE..."WebServiceHost 继承自 ServiceHost,能自动创建所需服务端点(Endpoint、WebHttpBinding)等细节。当然,我们依旧可以使用原有的 WCF client proxy 来调用上面的服务。 var factory = new WebChannelFactory<IMyService>(new Uri("http://localhost:81")); var proxy = factory.CreateChannel(); using (proxy as IDisposable) { Console.WriteLine(proxy.CreateUser("zhangsan", "23").Name); Console.WriteLine(proxy.DeleteUser("lisi")); }
或许我们会觉得为一个资源创建四个方法显得很繁琐,那么我们可以按下面的方式进行,只不过对 WCF client proxy 就有些麻烦了。 [ServiceContract] public interface IMyService { [OperationContract] [WebInvoke(UriTemplate = "/User/*", Method = "*", ResponseFormat = WebMessageFormat.Json)] string User(); } public class MyService : IMyService { public string User() { var request = WebOperationContext.Current.IncomingRequest; var method = request.Method; var args = request.UriTemplateMatch.WildcardPathSegments; switch (method) { case "POST": return "POST..."; case "DELETE": return "DELETE..."; case "PUT": return "UPDATE..."; default: return "GET..."; } } }
WebOperationContext 提供了大量的方法,可以获取所有的请求细节,也可以对返回信息进行设置。VS2008 提供了 AJAX-enabled WCF Service,我们只需在服务上面添加一个 [WebGet] 即可实现 IIS-Host RESTful WCF Service。 [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class Service1 { // Add [WebGet] attribute to use HTTP GET [OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Xml)] public string Hello(string name) { return "hello " + name; } }
在浏览器中输入 "" 就可以看到调用结果。有几点需要注意:1. 缺省情况下,我们无法使用 UriTemplate,必须把配置文件中 "enableWebScript" 注释掉。 <behavior name="Test.WCF.Service1AspNetAjaxBehavior"> <!--<enableWebScript />--> </behavior>
2. 必须在 .svc 中添加 "WebServiceHostFactory"。Hello.svc <%@ ServiceHost Language="C#" Debug="true" Service="Test.WCF.Service1" CodeBehind="Service1.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
我们改造一下,使其能支持 GET/POST 和 UriTemplate。 [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class Service1 { [OperationContract] [WebInvoke(Method = "*", UriTemplate = "Hello/{name}", ResponseFormat = WebMessageFormat.Xml)] public string Hello(string name) { return "hello " + name; } }
转载地址:https://blog.csdn.net/zengjibing/article/details/3814975 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月17日 08时40分26秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
区块链技术融合,全流程食品溯源不是伪命题
2019-04-29
比特币减半是利空还是利多
2019-04-29
供应链金融线上化的逻辑与趋势
2019-04-29
消费金融的短“危”长“机”
2019-04-29
看区块链如何完善征信制度
2019-04-29
正确认识P2P,从容面对风暴
2019-04-29
可临摹的PSD分层模板,拆解上线,高逼格电商设计竟如此简单?
2019-04-29
学习UI设计需要学习哪些软件?
2019-04-29
PNG免抠素材教你如何设计一张有创意的中秋节热点海报?
2019-04-29
超炫彩光效数码产品线条感海报PSD分层模板,炫亮抓你眼球
2019-04-29
电商美工中秋节电商淘宝页面设计模板素材,临摹参考框架
2019-04-29
财务金融类网页及app界面设计模板
2019-04-29
纯干货 | UI界面中按钮设计CTA按钮\订阅按钮
2019-04-29
天气预报\气象服务APP素材框架模板|UI及UX设计好帮手
2019-04-29
弹窗实用素材模板|UI设计中的弹窗设计技巧,快get
2019-04-29
免抠PNG素材使用技巧
2019-04-29
优质淘宝产品描述页模板框架PSD分层模板,美工实用素材
2019-04-29
实用素材|UI设计师需要的输入框和表单
2019-04-29
UI网页头部设计模板素材|这么多讲究,你知道吗?
2019-04-29
海报PSD分层促销模板|深层剖析设计套路
2019-04-29