博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
REST下的WCF的寄宿方式
阅读量:6641 次
发布时间:2019-06-25

本文共 3444 字,大约阅读时间需要 11 分钟。

  如同SOA下的WCF,REST架构下的WCF也有多种多样的寄宿方式,如IIS寄宿,自寄宿等等,即使它只有一种协议。

由于REST基于HTTP协议的特点,所以这种架构下的WCF寄宿时,需要有Web服务器的支持。那么很显然,微软肯定会使用
自己的Web服务器IIS了。
本节目录:
1、IIS寄宿
2、控制台程序寄宿(暂且将它称为自寄宿)
当然,REST WCF还有其他的寄宿方式,我这里只挑出典型的两种给大家介绍。有兴趣的朋友不妨试试其他的寄宿方式。
本节中所使用的实例还是上节所使用的例子。Demo结构图如下:

结构说明:Client为服务消费者,Contracts定义服务契约、数据契约,Services定义服务的实现,SelfHost、WebHost:自寄宿、IIS寄宿程序宿主程序

在IIS或者自寄宿中使用同样的服务契约。服务契约的定义如下:

[ServiceContract]public interface ILog{[OperationContract][WebGet(UriTemplate = "/")]List
GetAll();[OperationContract][WebGet(UriTemplate = "/Log/{year}/{month}")]List
GetMonthLog(string year, string month);}

  

数据契约定义:

[DataContract]public class LogEntity{[DataMember]public int ID { get; set; }[DataMember]public string EventName { get; set; }[DataMember]public string Level { get; set; }[DataMember]public DateTime Time { get; set; }}

  

服务的实现代码:

#region ILog 成员public List
GetAll(){return GetLogEntityList();}public List
GetMonthLog(string year, string month){List
logEntities = GetLogEntityList();List
logList = new List
();logEntities.ForEach(log =>{if (log.Time.Year.ToString() == year && log.Time.Month.ToString() == month){logList.Add(log);}});return logList;}#endregion

  

1、IIS寄宿。
众所周知Web程序基于HTTP协议,REST也基于HTTP。REST架构认为:WEB很成功、很简洁,不用那么复杂。所以基于
IIS的寄宿就很容易理解了。在IIS的寄宿中,我直接建了一个Web项目,然后在WCF 服务文件里面里提供对服务的调用。
代码如下:

public List
GetAll(){LogServices services = new LogServices();return services.GetAll();}public List
GetMonthLog(string year, string month){LogServices services = new LogServices();return services.GetMonthLog(year, month);}

  

这样就实现了接口规范中定义的对外提供服务。

2、控制台程序寄宿。
2.1通过编码实现REST WCF 寄宿。
寄宿代码如下:

static void HostViaCode(){using (WebServiceHost host = new WebServiceHost(typeof(LogServices))){ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(ILog), new WebHttpBinding(),"http://127.0.0.1:6688/LogService");endpoint.Behaviors.Add(new WebHttpBehavior());Console.WriteLine("服务开启...");host.Open();Console.ReadLine();}}

  

2.2、通配置的方式实现REST WCF 寄宿。
首先在配置文件中进行相关的终结点等等配置。配置文件如下:

  

对WCF SOA 架构有一点了解的同学,一看就明白了,是的,REST架构下采用自寄宿的方式进行寄宿时和SOA中没有什么不同。

在这种配置寄宿时的代码如下:

using(WebServiceHost host=new WebServiceHost(typeof(LogServices))){Console.WriteLine("服务开启...");host.Open();Console.ReadLine();}

  

这样就实现了在控制台程序中对REST WCF服务的寄宿。

在IE中调用GetAll接口,获取到的数据如下图:

在IE中调用GetMonthLog接口,获取到的数据如下图:

最后,在Client中,调用服务,代码如下:

private const string address = "Http://127.0.0.1:8866/LogService";static void Main(string[] args){InvokeRESTService();Console.ReadLine();}static void InvokeRESTService(){HttpWebRequest webRequest = WebRequest.Create(address) as HttpWebRequest;webRequest.Method = "GET";HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;using (StreamReader reader=new StreamReader(webResponse.GetResponseStream()) ){Console.WriteLine(string.Format("获取的调用结果为:{0}",reader.ReadToEnd())); }}

  

不管是IIS寄宿,还是自寄宿,不同的寄宿方式下,客户单调用结果如下图:

提示,通过配置的方式寄宿REST WCF 服务,虽然在服务端程序启动时,也会有一个Asp.Net Development Server

启动,但是它对客户端对服务的调用没有影响。我们可以看到,服务端在启动后,如果关闭Asp.Net Development Server,
客户端对服务的调用依然是成功的。

以上分别是 REST WCF在IIS与控制台程序下的寄宿方式。同样地它一定也能在其他程序:如Windows Service程序,Winform程序中实现寄宿。

另外,我对前三节中契约的定义有个小的变动,就是在[WebGet(UriTemplate = "/Log/{year}/{month}")]中用Log替换了Get,这样能更清晰地
表述REST思想。

 

转载地址:http://rzovo.baihongyu.com/

你可能感兴趣的文章
排序算法之堆排序及其C语言代码实现
查看>>
Linux Shell基础 Bash常见命令 echo命令
查看>>
公开一个云计算和云存储的源代码.
查看>>
js点击出现二级菜单,点击二级菜单主菜单换成二级菜单
查看>>
Git远程操作详解(clone、remote、fetch、pull、push)
查看>>
jquery mobile 复选框和单选框
查看>>
cookie,session与中间键
查看>>
webstorm快捷键
查看>>
@Selector 的一些总结
查看>>
OpenJudge/Poj 1936 All in All
查看>>
orcale 之 数据完整性约束
查看>>
spring boot自定义properity
查看>>
<20180927>新开一篇章记录常用到的IT名词
查看>>
mysqldump导出sql文件中insert多行问题
查看>>
html5调用手机本地摄像头和相册识别二维码详细实现过程
查看>>
怎么去掉zencart模板网址后面的zenid=数字这个东西
查看>>
window 命令行telnet 不能用问题
查看>>
关于C语言中%p和%X的思考
查看>>
ArcGIS 基础2-编辑数据
查看>>
Poedu_项目2_Lesson005 课后练习
查看>>