HelloWord之WCF文件的猫咪形式
不多闲话,直接进主题吧!
WCF在4.0版本里有这么一个新的特性没有.svc的文件服务激活。
为了验证这么句话,".svc对于服务激活来说就是起到了这么一个映射的作用",今天就用"Hello Word"来验证它吧!.svc文件在我们建立WCF服务项目的时候VS会自动帮我们创建好(图1);我们也可以把它修改成下面的方式(图2)。
图1.(VS自己创建)
图2.(自己修改的)
为了不偏移今天的主题,我们把图1的形式叫"猫";图2的形式叫"咪"。然后我们可以看看猫咪都是可以说"Hello Word".先来看我们"猫"的形式,也是VS为我们生成的结构:
首先我们来新建一个WCF的服务项目吧!叫IService吧,当我们创建好后,VS会为我们创建好如下图3.的样子。
图3. 好吧!VS果然强大吧,创建好了,但是我现在看着他们的名字不爽,我要给它们从新换个名字,先把IService1.cs改成IService.cs吧!Service1.svc文件改成HelloService.svc吧!咦,在改Service1.svc的文件时候并没有改IService1.cs友好,不错VS是帮我们改了Service1.svc成了HelloService.svc了,如下图4.
图4.现在来看看它到时改了没,我们来打开HelloService.svc文件看看,打开它方式在它上面邮件选择'打开方式'里的"带编码的Web服务编辑器"的方式打开它,来看看它的真面目,如下图5.
图5.原来并不了想象中那么友好,实际上它的内在没给我们修改,然后就需要我们手动来修改它和我们的HelloService.svc文件名字同步了。修改后如下图6.
图6.修改好了,那就开始我们的服务端吧!
由于我也是新学WCF的新人,为了更多新接触WCF和我一样的人,我还想多说几句关于服务端的话,首先服务内容是什么呢?服务内容就是我们的IService.cs文件里定义的契约决定,那就来看看我们IService.cs里的契约吧!
![](/assets/blank.gif)
![](/assets/blank.gif)
namespace WCF_HelloService {/// <summary>/// 服务的内容是有IService决定/// </summary> [ServiceContract]public interface IService{[OperationContract]string ServiceMeaasge();} }
既然是服务端,谁提供服务呢!HelloService.svc在这里的作用就是提供服务,提供服务那肯定就是服务对象了,简单的说吧!服务对象负责具体实现服务,当客户端访问服务时,一个服务对象被创建,相应的方法(契约里规定的)被调用,方法执行的结果放回到客户端。那现在就来看看服务对象HelloService.svc吧!
![](/assets/blank.gif)
![](/assets/blank.gif)
namespace WCF_HelloService {/// <summary>/// 服务对象/// </summary>public class HelloService : IService{public string ServiceMeaasge(){return "Hello Word";}} }
到这里服务端我们就先搞到这里,跑起来看看服务端成功没有。
运行的方法很多,我这里说一个比较简单的方法:直接右键HelloService.svc选择在浏览器查看,结果如下图7.
图7.看来我们服务端是OK的。那什么时候创建服务对象,那就由我们的宿主程序决定,宿主程序就是服务宿主也就是ServiceHost,他在WCF运行时负责创建服务宿主,每个ServiceHost都对应着一个服务,在合适的时候ServiceHost对象会创建服务对象来响应客户端的请求. 那就在创建一个宿主程序,在我们的项目添加一个控制台程序进来,叫ConsoleWCF,首先先给控制台程序引进"ServiceModel",然后在添加我们服务端的服务引用,并且把服务引用的命名空间修改HelloWCF,如下图8.
图8.添加好服务端的引用后,VS后自动给我们项目添加app.config文件,这是我们只需要修改一点配置就可以去写我们的控制台程序了(宿主),当然要说的WCF的配置是最重要的也是有些新人比较头大的,当然这些配置也可用代码实现,哪来看看我们宿主程序的配置吧:
![](/assets/blank.gif)
![](/assets/blank.gif)
<?xml version="1.0" encoding="utf-8" ?> <configuration><system.serviceModel><bindings><basicHttpBinding><binding name="BasicHttpBinding_IService" closeTimeout="00:01:00"openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"useDefaultWebProxy="true"><readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"maxBytesPerRead="4096" maxNameTableCharCount="16384" /><security mode="None"><transport clientCredentialType="None" proxyCredentialType="None"realm="" /><message clientCredentialType="UserName" algorithmSuite="Default" /></security></binding></basicHttpBinding></bindings><client><endpoint address="http://localhost:3823/HelloService.svc" binding="basicHttpBinding"bindingConfiguration="BasicHttpBinding_IService" contract="HelloWCF.IService"name="BasicHttpBinding_IService" /></client><!--这里是为宿主程序的配置(Start)--><services><service name="WCF_HelloService.HelloService" behaviorConfiguration="WCF_HelloServiceBehavior" ><host><baseAddresses><add baseAddress="http://localhost:8000/WCF_HelloService"/></baseAddresses></host><endpoint address="" binding="basicHttpBinding" contract="WCF_HelloService.IService"></endpoint><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint></service></services><behaviors><serviceBehaviors><behavior name="WCF_HelloServiceBehavior"><serviceMetadata httpGetEnabled="true"/></behavior></serviceBehaviors></behaviors><!--stop--></system.serviceModel> </configuration>
配置的地方我有注释明确的说明,就不多解释了:
宿主程序的配置好了,哪来写我们的宿主程序,在宿主程序里我监听了一下配置里添加来自端口8000/WCF_HelloService,先看我们控台的程序吧:
![](/assets/blank.gif)
![](/assets/blank.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel;namespace ConsoleWCF {class Program{static void Main(string[] args){HelloWCF.ServiceClient Hello = new HelloWCF.ServiceClient();ServiceHost host = new ServiceHost(typeof(WCF_HelloService.HelloService));host.Open();Console.WriteLine("监听服务端的信息是:" + Hello.ServiceMeaasge().ToString());Console.WriteLine("正在监听终结点:http://localhost:8000/WCF_HelloService");Console.WriteLine("结束监听");Console.Read();}} }
控制台(宿主)写好了,运行起来看看结果吧!方法在我们的控制台程序上右键选择调试里的"启动新的实例",运行的结果如下图9,以及端口8000/WCF_HelloService访问结果图10.
图9
图10. 到这里以传统的"猫"的形式的WCF为你叫出的"Hello Word",嘿嘿!要是又哪里搞错的地方,或者描述不清楚或者有误的地方,还请大家多多指点。
说完以"猫"的形式,那在来看看我们以"咪"的形式。信不信我们的"咪"也能叫"Hello Word",其实大家也都注意了开始为大家展示的"猫""咪"的结构对比,"咪"就是少了一个XXX.svc.cs的文件,而多了一个XXX.cs的文件,所以说变化也就在服务端的文件,那就来慢慢解开这个面纱吧!
这次还是新建一个项目叫 Hello_WCF,还是添加以为服务项目经来,叫Hello.WCFService,进去把我们的契约IService1.cs改成IHelloWcfService.cs,并且给项目里添加一个文件夹叫Hello,如下图11.
图11.(为了方便,我们把图11的红色框中的蓝色文件删除掉,并且给Service1.svc换个新名字叫HelloWcfService.svc)然后我们删除掉HelloWcfService.svc.cs的文件,然后在添加一个HelloWcfService.cs的类文件,为了区分我们把契约文件IHelloWcfService.cs和HelloWcfService.cs都放在Hello文件里,如下图12.
图12.现在来打开HelloWcfService.svc里面看看,是什么东东如下图13:
图13.原来如此,我们需要把红线部分知道我们新加进来的HelloWcfService.cs上,让这个HelloWcfService.svc接纳我们为她新配的伴侣,需要改成如下:
<%@ ServiceHost Language="C#" Debug="true" Service="Hello.WCFService.HelloWcfService" CodeBehind="~/Hello/HelloWcfService.cs" %>
现在改好了,那就定义我们的契约吧!IHelloWcfService.cs:
![](/assets/blank.gif)
![](/assets/blank.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text;namespace Hello.WCFService {[ServiceContract]public interface IHelloWcfService{[OperationContract]string GetServiceMessage();} }
来用我们新建HelloWcfService.cs的文件继承契约文件,并且实现它吧!
![](/assets/blank.gif)
![](/assets/blank.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Hello.WCFService;namespace Hello.WCFService {public class HelloWcfService : IHelloWcfService{public string GetServiceMessage() {return "Hello Word";}} }
按照以前的做法,到这里我们就OK了,但是由于我们修改他的文件,所以我们还要修改他们的配置文件,为了更好的使用到元数据:
先来看看它未被修改之前的配置,如下图14.
图14.
我们需要修改它成下面的形式:
![](/assets/blank.gif)
![](/assets/blank.gif)
<?xml version="1.0" encoding="utf-8"?> <configuration><system.web><compilation debug="true" targetFramework="4.0" /></system.web><system.serviceModel><services><service behaviorConfiguration="HelloWcfServiceBehavior" name="Hello.WCFService.HelloWcfService"><endpoint address="" binding="wsHttpBinding" contract="Hello.WCFService.IHelloWcfService"><identity><dns value="localhost"/></identity></endpoint><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint></service></services><behaviors><serviceBehaviors><behavior name="HelloWcfServiceBehavior"><serviceMetadata httpGetEnabled="true"/><serviceDebug includeExceptionDetailInFaults="false"/></behavior></serviceBehaviors></behaviors></system.serviceModel></configuration>
修改好配置,来跑跑我们配置的服务吧!(注意使用自己修改文件的方式一定要注意命名空间,要是出错,先检查自己代码的命名空间)。来看下结果吧!如下图15.
图15.到这里是不是有点眼熟,呵呵说明我们的服务已经OK了!接下来需要一个宿主程序来监听我们服务了,接下来给项目搭建一个控制台程序,方法同上,就叫HelloWcf,控制台程序如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace HelloWcf {class Program{static void Main(string[] args){HelloWCF.HelloWcfServiceClient Hello = new HelloWCF.HelloWcfServiceClient();Console.WriteLine("从服务器端口下来的信息:");Console.WriteLine(Hello.GetServiceMessage());Console.ReadLine();}} }
来看看结果如下图16:
图16.可以发现这次并没有在宿主这边经行配置,这就是"咪"形式,因为在服务端经行了配置,我们在引用服务端的时候,他们为我们自动添加app.config文件里已经添加进来我们原本需要手动的配置.可以看下配置如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration><system.serviceModel><bindings><wsHttpBinding><binding name="WSHttpBinding_IHelloWcfService" closeTimeout="00:01:00"openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"maxBufferPoolSize="524288" maxReceivedMessageSize="65536"messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"allowCookies="false"><readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"maxBytesPerRead="4096" maxNameTableCharCount="16384" /><reliableSession ordered="true" inactivityTimeout="00:10:00"enabled="false" /><security mode="Message"><transport clientCredentialType="Windows" proxyCredentialType="None"realm="" /><message clientCredentialType="Windows" negotiateServiceCredential="true"algorithmSuite="Default" /></security></binding></wsHttpBinding></bindings><client><endpoint address="http://localhost:6332/HelloWcfService.svc"binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IHelloWcfService"contract="HelloWCF.IHelloWcfService" name="WSHttpBinding_IHelloWcfService"><identity><dns value="localhost" /></identity></endpoint></client></system.serviceModel> </configuration>
呵呵!我们"咪"也叫出了"Hello Word",本人理解有限,要是那里错了,还请各位多多指导,在此特谢下明哥指导!
其实对于新手来说WCF的配置有时会显得有点麻烦,其实在宿主程序那里我们的配置也可以用代码完成,就拿上面的"猫"结构的宿主,我们也可以使用下面的方式去实现:
![](/assets/blank.gif)
![](/assets/blank.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using WCF_HelloService; namespace ConsoleWCF {class Program{static void Main(string[] args){HelloService.ServiceClient Hello = new HelloService.ServiceClient();ServiceHost host = new ServiceHost(typeof(WCF_HelloService.HelloService), new Uri("Http://localhost:8000/WCF_HelloService"));host.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "");host.Open();Console.WriteLine("监听服务端的信息是:" + Hello.ServiceMeaasge().ToString());Console.WriteLine("监听的终结点:Http://localhost:8000/WCF_HelloService");Console.WriteLine("结束监听");Console.Read();}} }
上面这种写法,就可以不用去配置,但是看起来还是感觉配置的好,不用写这么多代码,那里看看运行的结果呗如图17:
图17.不想写配置就这么麻烦的写代码也是可以实现的。
今天也就分享这么一点小玩意吧!希望对新手有所帮助,博客上要是存在什么不对的地方还请大家多多指正哦!很感谢明哥的指导哦!
转载于:https://www.cnblogs.com/HuiTai/archive/2012/05/11/esay_WCF.html
HelloWord之WCF文件的猫咪形式相关推荐
- 猫咪视频_猫视频如何进入您的手机
猫咪视频 用Layman的术语解释数据如何在Internet上移动 (Explaining How Data Moves Around the Internet in Layman's Terms) ...
- 《解压猫咪》用户隐私政策
您在使用本公司的服务和产品<解压猫咪>时,本公司可能会收集和使用您的相关信息.希望通过本<隐私政策>向您说明. 重要:TalkingData分析服务 TalkingData为移 ...
- 猫咪应用苹果版下载_关于猫的应用
猫咪应用苹果版下载 A story about cognitive load and a stark pivot of ideas 一个关于认知负担和观念的鲜明枢纽的故事 Challenge: cre ...
- 米兰大学发布论文与猫咪叫声数据集,分类喵喵叫
来源:HyperAI超神经本文约1000字,建议阅读5分钟 米兰大学计算机系的研究团队,试图用隐式马尔科夫方法将猫咪在不同环境状态下的喵喵叫识别出来,他们还真的成功了. 关键词:声音识别 动物AI 机 ...
- 猛男把400+条猫咪叫声做成数据集,可识别猫咪的3种不同状态丨开源
萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 这年头,就连喵星人也有自己的语音数据集了. 画风是这样的: 没错,来自米兰大学计算机系的几位猛男,和生物系.兽医系的小伙伴们一起,收集了21 ...
- 青龙羊毛——猫咪放羊(搬运)
分享两个新脚本,一个是tom大佬发的猫咪,一个是肥皂大佬的放羊!自己玩,小毛毛! 1.脚本 大佬发的是文件,我就不上传仓库了,大家自己传到自己的青龙上面吧! ①Tom大佬--猫咪 ②肥皂大佬--放羊 ...
- 基于SVM的猫咪图片识别器
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 基于SV ...
- python制作一个计时器_用Python制作一个猫咪小秒表
Python基础视频教程 入门免费观看-创客学院www.makeru.com.cn 秒表是一项随处可见的神奇小物件,最常用到秒表的两大场景,一个是运动会,另一个是健身房,因此也总是让人联想到汗水和心 ...
- 按键猫咪完美全键盘版教程
bongo cat mver全键盘版,又名按键猫咪,其实之前本站也有推荐过该软件,不过推荐的仅提供了猫咪几个键盘的按键动作,而本次带来的版本是拥有完美全键盘版的,当然同时依然是一款可用于装饰直播/视频 ...
- 纯CSS3绘制的猫咪老师——献给喜欢CSS3及《夏目友人帐》的你
2019独角兽企业重金招聘Python工程师标准>>> 最近正发愁着毕业设计做些什么,而后闲逛时看到了诸如twitter小鸟.哆啦A梦.灰太狼等纯CSS3实现的图像.于是本着初学的心 ...
最新文章
- 修改jenkins启动的默认用户
- OpenCV+Tensorflow实现实时人脸识别演示
- 领域驱动设计(DDD)架构演进和DDD的几种典型架构介绍(图文详解)
- Linux 学习手记(6): 磁盘、分区、MBR与GPT
- js createElement appendChild createTextNode用法
- python的函数的定义与调用
- QML Imports声明
- android自动化持续集成,Android系统的持续集成自动化测试框架的研究与实践
- 如何成为架构师?3条有效的实战经验
- uwsgi和nginx的故事
- 将pyecharts生成的html转为图片的一些问题
- 星河麒麟V10 安装达梦数据库DM8教程
- ei拼音的四个声调对应的字_幼儿园学前班拼音教案:复习 ei 以及四声调
- linux ./ 执行run文件,如何在Ubuntu中执行.bin和.run文件
- ZJOI2019 麻将
- 国内十大正规现货交易平台排名(2021版榜单)
- 【POj1305】毕达哥拉斯三元组
- 以太网阻塞的常见原因与解决方法
- 去除office非正版提示的方法(转)
- MIMIC-III 数据集处理 | OverflowError: Overflow in int64 addition 解决方法