一个简单WCF项目的建立 by wsz

      由于搬砖的需要,不得不学一点与WCF有关的东西。具体是因为前几周在64位环境下写的一个dll不能被集成到合作伙伴的32位工程中,但是要修改文件实在是划不来,一个压缩后600M的文件搬来搬去的也是让人蛋碎。因此想到了WCF。这样只要提供一个service,运行一个host,然后在client上调用就可以了。貌似是一件很简单的事,但是却做了整一下午还多。

  WCF的确是个好东西,从功能来看,WCF可以看作是ASMX,.Net Remoting,Enterprise Service,WSE,MSMQ等很多我不懂的技术的并集。WCF中支持的传输协议包括HTTP、TCP、Peer network等很多我不懂的协议。简单介绍一下HTTP,和TCP的地址类型,大概是这样子的:

HTTP地址
        即使用HTTP协议进行传输(包括https安全传输协议)。其地址形式为
        http://localhost:8000/
        如果地址中为制定端口号,则默认端口为80
TCP地址
        使用TCP协议进行传输,其形式为:
        net.tcp://localhost:8000/

下午经历了一个由HTTP到TCP过度的一个痛苦过程。个人感觉TCP要比HTTP麻烦那么一点。就用HTTP协议简单介绍一下这个建立过程。

 

一个简单的WCF

建立host可以用两种方式,一种是直接建立一个WCF服务集+一个host项目,另一种是建立两个类库+一个host项目。直观的区别是用服务集可以将interface和service放在一个项目下;否则就是用一个类库作为interface,另一个作为service。这里就用两个类库为例吧。先在解决方案中添加一个类库取名Contract作为服务契约(要添加ServiceModel的引用),在建立一个Service类库(要添加ServiceModel和Contract的引用)。在Contract中写一个简单的interface如下(用来计算a与b的和):

namespace Contract

{

    [ServiceContract]

    public interface ICaculate

    {

        [OperationContract]

        int Caculate(int a,int b);

    }

}

[ServiceContract]表示服务契约,就是在ServiceModel的引用下的。

在Service中实现这个类

namespace Service

{

    public class myCaculate:ICaculate

    {

        public int Caculate(int x, int y)

        {

            return x + y;

        }

    }

}

接下来添加一个Host项目比如一个控制台程序,大概是这样的(要把Host设置为主项):

 

在Host项目中要添加ServiceModel,Service和Contract的引用。这里有两种方式写Program中的代码。一种是直接在代码写协议的类型,另一种是在App.config中设置协议。这里用配置文件的方式,因为这样host中的代码会非常简单,而且个人感觉App.config在WCF中扮演一个很犀利的角色。这需要我们先生成一个大概的App.config代码框架,再根据具体情况设置参数(如果整个配置文件都是手写的,那只能Or2)。具体的编辑工具在VS2010的工具à服务配置编辑器中。打开Host中的配置文件,主要的任务是添加service和behavior,此外要建立一个url作为endpoint。这里选择basicHttpBinding绑定方式。具体操作很简单就不赘述了,用起来很方便。重要的是设置完成之后别忘了保存,否则就白费了。生成的配置文件大概是这样的:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <system.serviceModel>

        <behaviors>

            <serviceBehaviors>

                <behavior name="Behavior0">

                    <serviceMetadata httpGetEnabled="true" />

                </behavior>

            </serviceBehaviors>

        </behaviors>

        <services>

            <service behaviorConfiguration="Behavior0" name="Service.myCaculate">

                <endpoint address="http://localhost:8080/HelloService" binding="basicHttpBinding"

                    bindingConfiguration="" contract="Contract.ICaculate" />

                <host>

                    <baseAddresses>

                        <add baseAddress="http://localhost:8080/HelloService" />

                    </baseAddresses>

                </host>

            </service>

        </services>

    </system.serviceModel>

</configuration>

Behavior的名字是随便取的,这里的url是http://localhost:8080/HelloService。

这样host的main函数中代码就很简单了

    ServiceHost host = new ServiceHost(typeof(myCaculate));

            host.Open();

            Console.WriteLine("Start Your Service.");

            Console.ReadKey();

            host.Close();

这么几行就够了。这样host就可以运行了。接下来建立一个控制台程序作为Client。建立好之后,先让Host运行起来,然后在client的引用中添加ServiceReferences http://localhost:8080/HelloService

这样在Client的代码中就可以调用Service中的myCaculate类来计算两个数的和了。

在Client中可以直接调用Service(代码比较麻烦)或者通过代理调用(简单多了)。

代理调用的代码如下:

ServiceReference1.CaculateClient ca = new ServiceReference1.CaculateClient();

        Console.WriteLine(ca.Caculate(6, 7));

一个简单的http协议的WCF就是在这样了。在Host的App.Config中可以进行很多参数的设定,比如传输的最大字节,timeout等。都根据具体的需要进行设定。对于TCP协议的要麻烦一点。不过大体流程是一样的。

         WCF的跨平台性很好,而且集成了多种协议,微软的这个产品的确令人佩服。

转载于:https://www.cnblogs.com/smart-code/archive/2012/08/30/2664665.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据常见问题:数据倾斜

offer收割系列介绍&#xff1a; 1、分享桥哥本人或小伙伴在面试大厂时遇到的真题&#xff0c;并给出参考答案&#xff01;&#xff01;如果能帮到大家&#xff0c;点赞、收藏、评论是对我最大的支持&#xff01;&#xff01; 2、涉及岗位&#xff1a;主要为大数据开发、数据仓…

一图看懂新一代人工智能知识体系大全

来源&#xff1a;财经头条摘要&#xff1a;人工智能的发展离不开基础支持层和技术层&#xff0c;基础支持层包括大数据、计算力和算法&#xff1b;技术层包括计算机视觉、语音识别和自然语言处理。人工智能的技术本质是什么&#xff0c;本文会详细分析。人工智能的发展离不开基…

Redis是单线程为什么还那么快?

Redis为什么还那么快 基于内存   Redis完全基于内存&#xff0c;绝大部分请求是纯粹的内存操作&#xff0c;Redis将数据存储在内存中&#xff0c;读写数据的时候不会受到硬盘I/O速度的限制&#xff08;内存速度为什么比硬盘快&#xff1f;&#xff09;&#xff0c;类似于Hash…

iPhone是否越狱的检测方法

今天项目中要用到检查iPhone是否越狱的方法。 Umeng统计的Mobclick.h里面已经包含了越狱检测的代码&#xff0c;可以直接使用 /*方法名:* isJailbroken*介绍:* 类方法&#xff0c;判断设备是否越狱&#xff0c;判断方法根据 apt和Cydia.app的path来判断*参数说明…

阿里、字节offer收割系列:数据仓库岗(面试真题,建议收藏)

【offer收割系列介绍】 1、分享桥哥本人或小伙伴在面试大厂时遇到的真题&#xff0c;并给出参考答案&#xff01;&#xff01; 2、涉及岗位&#xff1a;主要为大数据开发、数据仓库&#xff08;桥哥干过的&#xff09;&#xff0c;其它岗位也可参考 3、涵盖技术&#xff1a;mys…

MIT新开发的 AI 模型有望改进恶性脑瘤治疗

来源&#xff1a;人工智能和大数据美国研究人员新近开发出一种人工智能模型&#xff0c;能够为胶质母细胞瘤患者设计出最小剂量给药方案&#xff0c;在缩小肿瘤的同时减少药物带来的毒副作用&#xff0c;改进患者生活质量。胶质母细胞瘤是一种常见的恶性脑瘤&#xff0c;常见疗…

git远程分支修改名字

本地分支重命名(还没有推送到远程) git branch -m oldName newName远程分支重命名 重命名远程分支对应的本地分支 git branch -m oldName newName删除远程分支 git push --delete origin oldName上传新命名的本地分支 git push origin newName把修改后的本地分支与远程分支关联…

30款顶级CSS工具及应用-CSDN.NET

30款顶级CSS工具及应用-CSDN.NET. 第3个CSS3PS尤其令惊艳&#xff01;&#xff01;&#xff01;非常强大的效果&#xff0c;无需安装&#xff0c;直接photoshop弄好&#xff0c;文件——脚本——选择pscss3——再用chrome打开即可&#xff01; 转载于:https://www.cnblogs.com…

建议收藏丨大数据集群常用监控命令(内存、磁盘、CPU、网络)

大家好&#xff0c;我是明月十四桥&#xff01;&#xff01; 擅长领域&#xff1a;python黑科技、大数据后端研发、数据仓库 今日重点&#xff1a; ① 学会查看linux各种状态&#xff0c;包括&#xff1a;网络IO、磁盘、CPU、内存等&#xff1b; ② 学会理解命令所代表的含义&a…

中科院王飞跃:新的智能全球化将要来临,人工智能标准化为时尚早

中国科学院自动化研究所复杂系统管理与控制国家重点实验室主任王飞跃来源&#xff1a;财经网摘要&#xff1a;8月11日&#xff0c;中国科学院自动化研究所复杂系统管理与控制国家重点实验室主任王飞跃在由厚益控股和《财经》杂志联合主办主题为“共享全球智慧 引领未来科技”的…

Linux设置gopath

vim /etc/profile #编辑gopath&#xff0c;写入如下export GOROOT/usr/local/go #设置为go安装的路径&#xff0c;有些安装包会自动设置默认的goroot export GOPATH$HOME/gocode #默认安装包的路径 可以加自己想要的路径&#xff0c;用:分割 export PATH$PATH:$GOROOT/bi…

建议收藏丨sql行转列的一千种写法!!

大家好&#xff0c;我是明月十四桥&#xff01;&#xff01; 爱好特长&#xff1a; 1、爱好和特长有很多&#xff0c;擅长word、excel、ppt、wind等软件的安装与卸载&#xff1b; 2、精通PE、PS、PB、DCF、PEG等单词的拼写&#xff1b; 3、熟悉Windows、Linux、Mac、Android、I…

ORA-32004问题解决

问题描述&#xff1a; JSSSTR> startup force nomount;ORA-32004: obsolete and/or deprecated parameter(s) specifiedORACLE 例程已经启动 解决方法&#xff1a; 通过查看alter.log,并删除相应的值 上面提到的alert log文件位于%ORACLE_BASE%\admin\%ORACLE_SID%\bdump里。…

深度学习并非万能:你需要避免这三个坑

作者 | George Seif编译 | 专知整理 | Mandy, Sanglei摘要&#xff1a;本文是人工智能专家George Seif撰写的博文&#xff0c;介绍了在当前深度学习比较火热的情景下需要避免的三个坑。Tweaking Neural Net ParametersThree reasons that you should NOT use deep learning深度…

Redis配置文件常用配置消息解说--版本5.0.9

单位 配置文件中的uint单位对大小写不敏感 引用包 INCLUDES redis中也可以引用其他的配置文件。需要注意的是&#xff0c;在主从复制机制中&#xff0c;主机或哨兵的命令“CONFIG REWRITE”不会重写“include”选项。Redis总是使用最后处理的行作为配置指令的值&#xff0c;…

万字长文丨7个经典问题,助你拿下Java面试(建议收藏)

擅长领域&#xff1a;execl、word、ppt 等 今日重点&#xff1a; ① 掌握面试的基本素质&#xff1b; ② 学会7个典型的java面试问题。 有问题的小伙伴欢迎加我主页vx。评论、点赞、收藏是对我最大的支持&#xff01;&#xff01;&#xff01; 目录 一、面试的目的 二、面…

剑指 Offer 09. 用两个栈实现队列(相邻相同操作只需要移动一次)

题目 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 示例 1&#xff1a; 输入&#xff1a; …

应用人工智能有助心理学发展

来源&#xff1a; 中国社会科学报摘要&#xff1a;人工智能及相关技术的发展&#xff0c;为心理学研究提供了突破性的研究方法和工具&#xff1b;心理学对大脑机制的研究成果运用于人工智能领域&#xff0c;也推动着人工智能研究的进步。心理学同人工智能联系紧密&#xff0c;自…

【粉丝福利、免费领取】:1000套PPT模板、100份简历模板、硬核学习资料+PDF资料(java、python、大数据、机器学习)

目录 1、100套小编购买的简历模板&#xff08;部分截图&#xff09; 2、1000套精品PPT模板&#xff08;部分截图&#xff09; 3、大数据-学习资料&#xff08;1.3G 硬核PDF&#xff0c;官方指南&#xff09; 4、python学习全集 5、Java基础、高级和面试资料 6、大数据-行…

HDU 1142 A Walk Through the Forest dijkstra + DFS

http://acm.hdu.edu.cn/showproblem.php?pid1142 题意&#xff1a; Jimmy在位置 1 &#xff0c;每天晚上要回位置2&#xff08;家&#xff09;&#xff0c;计算1到2的最短距离&#xff0c;Jimmy要先去一个地方然后再回家&#xff0c;到了那个地方离家的距离不能大于1到2 的最短…