首页 > 作文

详解WCF服务中的svc文件

更新时间:2023-04-06 01:05:49 阅读: 评论:0

一、新建一个wcf服务应用程序:

文件->新建->项目:选择wcf下面的wcf服务应用程序

二、分析wcfsvcdemo项目,该项目的结构如下:

在该项目中,会默认生成一个irvice1.cs的文件和rvice1.svc文件。rvice1.svc文件封装的就是提供给客户端的服务引用。
首先查看irvice1.cs文件,从名字上面就可以看出这是一个接口文件,里面定义了一个接口irvice1,接口上面使用了rvicecontract,意思是把这个接口声明为服务契约,服务契约是对客户端而言的,就是这个接口可以暴露出来让客户端可以看见。接口里面定义了两个方法,每个方法上面都使用了[operationcontract],意思是把这两个方法声明为操作契约。只有把接口里面的方法声明为操作契约,在客户端里面才可以看到相应的方法,否则在客户端里面看不到在接口里面定义的方法。

在来看rvice.svc文件,可以看到下面有一个锥刺股rvice.svc.cs文件,这个文件里面定义了一个继承irvice1接口的类rvice1,并实现了irvice1接口里面的方法。

删除rvice.svc.cs文件,可以查看rvice.svc文件,该文件里面就一行代码;

这里面有两个重要的参数:rvice和codebehind。rvice是属性值是wcf的服务实现类的完全限定名。codebehind是服务实现类所在的文件名。在运行的时候,宿主程序从svc文件中的rvice属性得到wcf服务的完全限定名,然后从配置文件中找到同名的rvicce,进而找到所有的endpoint,并根据其属性进行实例化。
配置文件中的rvice名字必须是rvice类名的完全限定名(即namespace.classname),endpoint的contract必须是rvice接口的完全限定名。否则,程序就无法从程序集中找到相应的类进行加载。
注意:如果要修改接口实现类的名称,必须使用“重构”的方式进行修改,因为只有利用“重构”的方式修改rvie类名的时候,.svc文件里面rvice的属性值才会被修改,利用其它方式修改类名,.svc文件里面rvice的属性值会保留原值,这样在运行的时候,根据svc里面rvice的属性值查找不到相应的类,程序就会报错。

svc文件里面还有一个重要的参数:rvicehostfactory。rvicehostfactory旨在解决从iis或was中访问自定义rvicehost的问题。因为从rvicehost派生的自定义宿主是动态配置的并且可能为各种类型,所以宿主环境从不会直接将其实例化。相反,wcf使用工厂模式提供宿主环境和服务的具体类型之间的间接层。除非进行通知,否则它使用返回rvicehost的实例的rvicehostfactory的默认实现。(在新建的svc文件中默认实现就是codebehind属性的值)。但也可以通过在@rvicehost指令中指定工厂实现的clr类型名称来提供自己的工厂(用于返回派生宿主)。

下面是用于返回派生的rvicehost的自定义rvicehostfactory:

其中customrvicehost是自定义的继承自rvicehost的类,用于读取配置文件的配置,customrvicehost类的定义如下:

若要使用此工厂,而不使用默认工厂,则应该在@rvicehost指令中提供相应的类型名称:

其中rvice是实现类的完全限定名,factory是自定义rvicehostfactory的完全限定名,public是一个dll文件。

若要使用此工厂,而不使用默认工厂,则应该在@rvicehost指令中提供相应的类型名称:
尽管对于从creatervicehost返回的rvicehost可以执行什么操作没有技术限制,但建议您尽可能使工厂实现简单化。如果有大量的自定义逻辑,最好将这些逻辑放入宿主内而不是工厂内,以便可以重用它们。
应在这里提及另一个承载api的层。wcf还具有rvicehostba和rvicehostfactoryba,可从中分别派生rvicehost和rvicehostfactory。对于您必须通过自己的自定义创建来交换元数据系统的大型组件的更高级方案,存在上述这些特性。

下面通过两个具体的示例程序分别实现上面描述的默认工厂和自定义工厂。

三、使用默认工厂方式

1、删除新建项目时自动创建的irvice1.cs和rvice1.svc文件,然后添加一个svc文件,在项目上面右键->添加->新建项:

2、在新建项里面选择web里面的wcf服务,命名为myrvice:

3、点“添加”,除了创建myrvice.svc文件以外,还会自动创建一个名为imyrvice.cs的接口文件,myrvice.svc.cs里面的myrvice默认实现imyrvice接口.

删除imyrvice接口里面自动生成的方法,添加一个getcurrenttime的方法,用来返回当前的时间,imyrvice接口定义如下:

4、myrvice.svc.cs里面的myrvice类实现imyrvice接口,myrvice类定义如下:

5、修改配置文件,增加rvice、binding等节点,修改后的配置文件如下:

主要是修改rvice节点里面的name是仍然的意思服务实现类的完全限定名,contract是服务接口的完全限定名。

6、把wcf服务部署到iis上面

在iis上面网站->添加网站:

配置网站名称、路径、ip地址和端口:

网站配置完成以后,浏览.svc文件,验证网站是否配置成功,如出现下面的截图,说明网站配置成功:

7、创建代理类

客户端引用wcf的时候一般是静态引用,直接添加服务引用,这种方式如果ip地址和端口号变了,需要用代码重新编译然后在部署,这样不方便。这里使用svcutil代理类的方式进行客户端的调用。

使用svcutil生成代理类:

新建一个项目,选择类库项目,把刚才生成的类文件添加到类库项目中,项目结构如下:

在类库项目中新添加一个类,命名为:myrviceproxy,使用这个类来调用代理类,myrviceproxy类的定义如下:

aprver1和aprver2是在配置文件中配置的ip地址和端口号,这样如果ip地址和端口号变了,只需要修改配置文件就可以。

getcurrenttime()方法是调用的代理电脑怎么重装系统类里面的方法,把该方法定义为静态方法。

8、创建客户端调用

在解决方案中,新建一个winform程序,界面上面只有一个button按钮,点击按钮,弹出当前时间。需要添加对myproxyrvice.dll文件的引用,在配置文件中增陌上桑原文及翻译加aprver1和aprver2两个节点,配置文件如下:

button按钮事件代码如下:

点击按钮后,运行结果如下:

四、使用自定义工厂的方式

1、新添加一个wcf服务,命名为customrvice,把默认生成的customrvice.svc.cs文件删掉,重新添加一个类:customrvice,该类继承自生成的icustomrvice接口,项目结构如下:

修改customrvice.svc文件:

customrvicehostfactory是在另外的public.dll里面创建的工厂类,用来返回rvicehost,public.dll的项目结构如下:

customrvicehost类继承自rvicehost类,代码如下:

customr超重vicehostfactory是工厂类,继承自rvicehostfactory,用来返回rvicehost,代码如下;

httpbinding代码如下:

把customrvice.svc部署到iis上面、创建代理类的方法、客户端调用和默认工厂里面的方法一样,此处不在描述。

项目代码下载路径:下载地址

到此这篇关于wcf服务中svc文件详解的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。

本文发布于:2023-04-06 01:05:47,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/46bb2224c9d72cc333574abfb47380e4.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:详解WCF服务中的svc文件.doc

本文 PDF 下载地址:详解WCF服务中的svc文件.pdf

标签:文件   接口   工厂   方法
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图