当前位置: 首页 > 编程日记 > 正文

WCF实现RESTFul Web Service

共同学习了前面一些概念,终于开始正题了哈。RESTful的Web Service调用直观,返回的内容容易解析。这里先会描述一个简单的场景--Web Service提供一个方法来搜索个人信息,传入人名,返回完整个人信息。
下面我们一步步用WCF实现一个RESTful的Web Service。在这之后分别描述用普通Console程序host在本地,以及用IIS发布到网络。

1. Contract

复制代码
namespace WcfRESTful
{
[ServiceContract]
public interface IPersonRetriever
{
[OperationContract]
[WebGet(UriTemplate = "Persons/{name}", ResponseFormat = WebMessageFormat.Json)]
Person GetPerson(string name);
}

[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public DateTime Birthday { get; set; }
}
}
复制代码

这里需要注意的是在方法GetPerson()上面的WebGetAttribute:
1.1 WebGetAttribute定义了该方法的访问方式为RESTful的Get(关于RESTful可以参考本小博中关于REST介绍的文章)。
1.2 UriTemplet描述了URL匹配的格式,当格式匹配时,{name}位置的字符串会被对应传入为方法参数。
1.3 ResponseFormat指定了返回的数据格式,可选项为JSON和XML。

2. Contract实现

复制代码
namespace WcfRESTful
{
public class PersonRetriever : IPersonRetriever
{
public Person GetPerson(string name)
{
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
return new Person { Name = name, Age = 22, Birthday = DateTime.Now };
}
}
}
复制代码

这个实现里面,我们简单的返回一个用传入名参数为name的Person实例。这里补充一点:如果ContectType是"Text",如果返回结果串包含特别字符(比如转义,双引号,XML文件片段等),有些情况会在IE中解析不正常,造成字段缺失,目前没有找到相关资料说明IE解析规则。为了方便和谨慎起见,直接用"text/plain"。

3. 在Console中Host Service

在第1,2步的基础上,我们开始在console中host这个service。

复制代码
namespace WcfRESTful
{
class Program
{
static void Main(string[] args)
{
Uri baseAddress = new Uri("http://127.0.0.1:9998/PersonRetriever");
using (ServiceHost host = new ServiceHost(typeof(PersonRetriever), baseAddress))
{
WebHttpBinding binding = new WebHttpBinding();
ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IPersonRetriever), binding, baseAddress);
WebHttpBehavior httpBehavior = new WebHttpBehavior();
endpoint.Behaviors.Add(httpBehavior);
host.Opened += delegate
{
Console.WriteLine("Hosted successfully.");
};
host.Open();
Console.ReadLine();
}
}
}
}
复制代码

让后我们通过URL:http://127.0.0.1:9998/PersonRetriever/Persons/Tom 就可以访问该Service了,其中"Tom"是需要查询的人名。在IE中输入该URL,回车之后的结果如下图:


4. 在IIS中Host Web Service

4.1新建一个WCF Service(或者Web Service依.Net Framework版本不同而定)工程,把第1,2步的Contract和实现Copy到App_Code文件夹下面。

4.2修改Service.svc - 注意,Factory="System.ServiceModel.Activation.WebServiceHostFactory"必须添加才可以直接在IE查看结果,但是Matedata将被屏蔽不能显示。

<%@ ServiceHost Language="C#" Debug="true" Service="WcfRESTful.PersonRetriever" CodeBehind="~/App_Code/PersonRetriever.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory"%>

4.3添加Endpoint到Web.config

复制代码
    <system.serviceModel>
<services>
<service name="WcfRESTful.PersonRetriever" behaviorConfiguration="ServiceBehavior">
<endpoint binding="webHttpBinding" contract="WcfRESTful.IPersonRetriever"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
复制代码

4.4添加工程目录到IIS虚拟路径,命名为WCFTest。

以上4.1-4.4的所有步骤都完成了,我们通过URL:http://16X.19X.18X.6X/wcftest/Service.svc/Persons/Tom 一样可以得到上面的结果{"Age":22,"Birthday":"\/Date(1329226087212-0500)\/","Name":"Tom"}。

这里需要补充一点,在4.1步骤,我们新建一个Web Service工程,仅仅是为了少写一些Web.Config的配置(会默认有system.web,complier等配置信息),其实我们完全可以新建App_Code文件夹,把Contact和Contract实现拷入该文件夹,然后在外层手工新建Service.svc,Web.config并写入相应配内容,一样可以成功部署和使用。

5. 总结
RESTful Web Service用更简单通用的协议(HTTP,少了SOAP这一道封装和解析),更直接的结果,让人眼前一亮,在资源不需要交互逻辑和复杂结构的情况下还是不错的选择。

http://www.cnblogs.com/KeithWang/archive/2012/02/14/2351826.html

相关文章:

VS QT插件

支持用VS编译qt工程 QT下载页&#xff1a;http://qt-project.org/downloads qt-vs-addin插件: http://download.qt-project.org/official_releases/vsaddin/qt-vs-addin-1.2.2-opensource.exe 转载于:https://www.cnblogs.com/Leo-Forest/p/3507017.html

使用AutoCAD 2021创建真实世界的土木设计项目

由工程组织创建|最后更新日期:2021年9月 时长:7h 24m | 7节| 64节讲座|视频:1280720&#xff0c;44 KHz | 大小解压后3 GB 流派:电子学习|语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 学会快速使用AutoCAD &#xff1b;专业地制作真实世…

Java学习总结:41(文件操作类:File)

Java文件操作类&#xff1a;File 在java.io包中&#xff0c;如果要进行文件自身的操作(例如&#xff1a;创建、删除等)&#xff0c;只能依靠java.io.File类完成。 File类的常用操作方法 No.方法类型描述1public File(String pathname)构造传递完整文件操作路径2public File(F…

关于大型网站技术演进的思考(四)-存储的瓶颈4

如果数据库需要进行水平拆分&#xff0c;这其实是一件很开心的事情&#xff0c;因为它代表公司的业务正在迅猛的增长&#xff0c;对于开发人员而言那就是有不尽的项目可以做&#xff0c;虽然会感觉很忙&#xff0c;但是人过的充实&#xff0c;心里也踏实。 数据库水平拆分简单说…

2022-2028年中国环卫行业产业链深度调研及投资前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国环卫行业市场行业相关概述、中国环卫行业市场行业运行环境、分析了中国环卫行业市场行业的…

curl命令具体解释

对于windows用户假设用Cygwin模拟unix环境的话&#xff0c;里面没有带curl命令&#xff0c;要自己装&#xff0c;所以建议用Gow来模拟&#xff0c;它已经自带了curl工具&#xff0c;安装后直接在cmd环境中用curl命令就可&#xff0c;由于路径已经自己主动给你配置好了。 linux …

如何修改配置以修复ThinkPad 小红帽滚轮失效?

本人使用ThinkPad X1 Carbon超级本&#xff0c;由于近期安装了遨游浏览器(Maxthon)&#xff0c;发现其总体体验还是不错&#xff0c;但是在本机器上有个明显的Bug&#xff1a;就是小红帽的滚轮不管用。 由于就查了网上相关资料并加以试验&#xff0c;最终得以解决&#xff0c;方…

在虚幻引擎5中重塑火箭联盟——口袋联盟

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |大小解压后:3.28 GB |时长:4h 21m 了解如何实现火箭联盟般的力学&#xff0c;并在短时间内创建最近的火箭…

Java学习总结:42(字节流和字符流)

字节流与字符流 上一节我们学习了文件操作类File&#xff0c;但是File类虽然可以操作文件&#xff0c;但是却不能操作文件的内容。如果要进行文件内容的操作&#xff0c;就必须依靠流的概念来完成。流在实际中分为输入流和输出流两种&#xff0c;输入流和输出流是一种相对的概…

用C#钩子写一个改键外挂

我的微信群——软件开发测试工程师交流群&#xff0c;欢迎扫码&#xff1a; 改键是一种习惯&#xff0c;比如在玩儿lol或者dota的时候。理论上玩儿什么游戏都可以改键。 做一个窗体&#xff08;点击Install——应用改键&#xff0c;点击Uninstall——撤销应用&#xff09;&…

Spring中WebApplicationContext

ApplicationContext是Spring的核心&#xff0c;Context我们通常解释为上下文环境&#xff0c;我想用“容器”来表述它更容易理解一 些&#xff0c;ApplicationContext则是“应用的容器”了:P&#xff0c;Spring把Bean放在这个容器中&#xff0c;在需要的时候&#xff0c;用getB…

洛谷 P1966 火柴排队

题意 给定2个等长序列a、b&#xff0c;要求通过交换使 \[\sum_{i1}^{n}(a_i-b_i)^2\] 最小。 分析 看着这个式子&#xff0c;我突然想到了方差。很明显&#xff0c;方差反应数据的波动程度&#xff0c;所以让数据集中就可以使方差变小了。而对应到这个公式&#xff0c;大方向就…

Revit结构2021-2022从零到精通

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |大小解压后:8.6 GB 含课程文件 |时长:14h 46m 涵盖Revit结构2021-2022的基本、中级和高级功能 Revit Str…

BZOJ1922: [Sdoi2010]大陆争霸

题目&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id1922 带限制最短路。 每个点真正的dis是max(dis[i],dis[v]),v是其保护点。 可以把题目中的保护转化为每个点的贡献。 每次扫一边连出的边做最短路把rd为0的点加入队列。 再扫一遍自己的贡献&#xff0c;更新它…

Java学习总结:43(转换流)

转换流 字节流和字符流的转换可以通过InputStreamReader、OutputStreamWriter两个类转换&#xff0c;下面是这两个类的继承结构和构造方法 名称定义构造构造方法InputStreamReaderpublic class InputStreamReader extends Readerpublic InputStreamReader(InputStream in)Out…

2022-2028年中国环保服务业投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国环保服务行业市场行业相关概述、中国环保服务行业市场行业运行环境、分析了中国环保服务行…

一个build.xml实例

<?xml version"1.0"?> <project name"ssh" basedir"." default"usage"> <property name"name" value"ssh"/> <property name"war.dir" value"war"/> &l…

Spring Boot 2.0 常见问题总结(一)

SpringBoot2.x 依赖环境和版本新特性说明 依赖版本 jdk8 以上, Springboot2.x 用 JDK8 , 因为底层是 Spring framework5 。jar 包方式运行 SpringBoot 项目时问题 打包成jar包&#xff0c;需要增加maven依赖。 <build><plugins><plugin><groupId>org.s…

UE4场景设计学习教程

视频:MPEG4视频(H264) 19201080 25fps 1400kbps |音频:AAC 44100Hz立体声128kbps 语言&#xff1a;西班牙语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:35节课(6小时36分钟) 文件大小:4.7 GB 学会使用这个强大的软件的工具&#xff0c;一步一步地创造…

Java学习总结:44(文件复制案例)

案例&#xff1a;文件复制(针对InputStream和OutputStream的操作应用) 流程图(比较复杂我就不敲了&#xff0c;直接拍出来) 例&#xff1a;实现文件复制操作 package Project.Study.FileCopyCase;import java.io.*;public class Test {public static void main(String[]args…

java多态的理解

Java中多态性的实现 什么是多态 面向对象的三大特性&#xff1a;封装、继承、多态。从一定角度来看&#xff0c;封装和继承几乎都是为多态而准备的。这是我们最后一个概念&#xff0c;也是最重要的知识点。多态的定义&#xff1a;指允许不同类的对象对同一消息做出响应。即同一…

2022-2028年中国高密度聚乙烯(HDPE)行业市场发展调研及投资前景分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国高密度聚乙烯(HDPE)行业市场行业相关概述、中国高密度聚乙烯(HDPE)行业市场行业运行环境、…

计算机视觉图像处理机器学习压缩感知等论文代码大全

点击链接进入相关博文 1.来自西弗吉利亚大学li xin整理的CV代码合集 主要包括&#xff1a; 1.图像去噪&#xff0c;编码&#xff0c;去马赛克&#xff0c;超分辨&#xff0c;分割&#xff0c;去模糊&#xff0c;纹理合成&#xff0c;修复&#xff0c;质量评估等 2.视频编码和目…

Java 17 VS Java 8: 新旧对决,这些Java 17新特性你不容错过

Java是一门非常流行的编程语言,由于其跨平台性、可移植性以及强大的面向对象特性而备受青睐。Java最初由Sun Microsystems公司于1995年推出,随着时间的推移,Java发展迅速,版本不断更新。本篇博客将重点介绍Java 17与Java 8的对比,以及Java 17的新特性。

VirtualBox装ghost XP

在win7 professional 64上安装了virtualBox4.3.14 r95030 版本&#xff0c;之所以要安装这个vb,是因为刚升级的vm 打开之后很占用cpu&#xff0c; 网上又说vb不是很占用cpu而且是开源的&#xff0c; 于是就安装来试试&#xff0c; 但是以前没玩过&#xff0c; 哪知道安装个xp都…

【Java】常用的函数式接口(含示例)

Supplier接口被称为生产型接口:指定泛型是什么类型,接口的get()方法就会生产什么样的类型的数据。具体怎样消费、怎样使用这个数据呢?就由之后传入的Lambda表达式决定吧!与生产工厂Supplier相反,Consumer用来消费,即使用一个数据。具体生成一个怎样的数据?就由之后传入的Lambda表达式决定吧!转换的过程是怎样的呢?就由之后传入的Lambda表达式决定吧!具体根据什么判断呢?就由之后传入的Lambda表达式决定吧!对某种数据类型的数据进行判断,返回一个布尔值。

写实的CG人物角色制作学习教程

艺术站-制作欧比旺克诺比逼真的Cg角色 大小解压后&#xff1a;4.98G 含课程素材文件 1920X1080 .mp4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 信息: 欧比旺是我一直以来最喜欢的角色之一&#xff0c;所以有时间做这个3D人像真的很好…

Java学习总结:45(字符编码)

字符编码 在实际工作中最常见的4种编码如下&#xff1a; GBK、GB2312&#xff1a;中文的国标编码&#xff0c;其中GBK包含简体中文与繁体中文两种&#xff0c;而GB2312只包含简体中文&#xff1b; ISO8859-1&#xff1a;是国际编码&#xff0c;可以描述任何文字信息(中文需要转…

js实现双击后网页自己主动跑-------Day55

公司的界面设计环节总算是告一段落了&#xff0c;必需要承认的是&#xff0c;这段时间晚间的学习带给我非常多益处。在工作中偶尔的应用&#xff0c;效果出奇的好&#xff0c;收到领导和同事的一些小赞扬&#xff0c;表示非常欣慰&#xff0c;也长了点不少自信&#xff0c;尽管…

2022-2028年中国高等职业教育产业投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国高等职业教育行业市场行业相关概述、中国高等职业教育行业市场行业运行环境、分析了中国高…