入门,构建第一个WCF程序

1、服务端

建立一个控制台应用程序作为Server,新建一个接口IData作为服务契约。这个契约接口一会儿也要放到Client端,这样双方才能遵循相同的标准。别忘了添加对

针对这个接口建立实现类,这个类才是真正干活的,工作在服务端,不出现在客户端:

using System;

using System.Text;

namespace Server

{

   /// <summary>

   /// 实现IData接口,此处不需要写契约标记

   /// </summary>

   public class DataProvider : IData

   {

       public string SayHello(string userName)

       {

           return string.Format("Hello {0}.", userName);

       }

   }

}

为工程添加一个App.config文件,这里面要定义与服务发布相关的参数。WCF中常见的做法是用代码写服务逻辑,但是用配置文件来定义服务发布方式,这样做的好处是松散耦合。

万事具备,只剩最后一步了,将服务发布出去:

  1. using System;
    
    using System.ServiceModel;
    
    namespace Server
    
    {
    
       class Program
    
       {
    
           static void Main(string[] args)
    
           {
    
               //定义一个ServiceHost,注意参数中要使用契约实现类而不是接口
    
               using(ServiceHost host = new ServiceHost(typeof(Server.DataProvider)))
    
               {
    
                   host.Open();
    
                   Console.WriteLine("Service Running ...");
    
                   Console.ReadKey();
    
                   host.Close();
    
               }
    
           }
    
       }
    
    }

有人可能会问服务发布到哪去了?没指定地址呀?这是一个初学者容易搞不明白的地方。

是的,此时App.config中的定义就发挥作用了,由于ServiceHost中指定对Server.DataProvider类服务,而App.config中定义了name="Server.DataProvider"的service,其下有endpoint,定义了绑定方式是basicHttpBinding,而http方式的baseAddress只有一个,就是 http://localhost:8080/wcf。

编译运行,屏幕显示Service Running ... 就是正常跑起来了,此时如果用命令行 netstat -ano | findstr "8080" 看一下,应该有如下输出:

  1. TCP    0.0.0.0:8080         0.0.0.0:0          LISTENING      4

  2. TCP    [::]:8080            [::]:0             LISTENING      4

表示我们的程序已经在TCP 8080端口开始监听了。值得注意的是PID是4,这是系统进程而不是我们自己的进程,这说明WCF程序对外提供HTTP服务时,是借用了系统功能(http.sys)。

此时如果我们用浏览器访问一下 http://localhost:8080/wcf,不报错,但是会提示“当前已禁用此服务的元数据发布”,这是由于默认不允许以http get方式获取服务的WSDL,我们不用管它,不影响后面的使用,以后的章节中我们再来看这个问题。


2、客户端

再建立一个控制台应用程序作为Client,把Server中的接口IData拷过来,因为这是服务契约。

为工程添加一个App.config文件,这里面要定义客户端访问的相关参数,这里我去掉了一些用不上的参数,以保持配置文件简单,防止各位看晕了头。

  1. <?xmlversion="1.0"encoding="utf-8"?>
    
    <configuration>
    
     <system.serviceModel>
    
       <!-- 看到client,就表明是客户端设置 -->
    
       <client>
    
         <!-- 定义访问时的终节点,name也是随意取的,注意address是Server端发布时指定的baseAddress+endpoint的address,binding也要对应,contract就更不用说了,由于之前把IData.cs拷过来的时候没有修改命名空间,所以还是Server.IData -->
    
         <endpointname="DataService"address="http://localhost:8080/wcf"binding="basicHttpBinding"contract="Server.IData"/>
    
       </client>
    
     </system.serviceModel>
    
    </configuration>

然后写代码,来调用Server端发布的SayHello方法:

using System;

using System.ServiceModel;

using System.ServiceModel.Channels;

namespace Client

{

   class Program

   {

       static void Main(string[] args)

       {

           //客户端访问有多种方式,此处只显示一种

           //利用ChannelFactory的CreateChannel方法创建一个IData的代理对象,其中参数“DataService”就是刚才在App.config中定义的endpoint的名称

           var proxy = new ChannelFactory<Server.IData>("DataService").CreateChannel();

//调用SayHello方法

           Console.WriteLine(proxy.SayHello("WCF"));

//用完后一定要关闭,因为服务端有最大连接数,不关闭会在一定时间内一直占着有效连接

           ((IChannel)proxy).Close();

       }

   }

}

编译运行,屏幕应能正常打印出“Hello WCF.”。第一个入门demo就搞定了,应该还是比较简单的。只是App.config的配置有些复杂,后面我们会看到,其实也可以不要配置,直接用代码搞定,不过从松散耦合的角度讲不建议这么做。

学习构建一个简单的wcf服务的更多相关文章

  1. WCF学习——构建一个简单的WCF应用(一)

    本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些准备开始学习WCF的初学者提供一些帮助. 在这个例子中,我们将实现一个简单的计算器和传统的分布式通信框架一样,WC ...

  2. WCF学习——构建一个简单的WCF应用(二)

    我们接着上一篇文章进行讲解 http://www.cnblogs.com/songjianhui/p/7060698.html 一:客户端通过添加引用调用服务 WCF应用服务被成功寄宿后,WCF服务应 ...

  3. gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

    目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...

  4. 重温WCF之构建一个简单的WCF(一)(2)通过Windows Service寄宿服务和WCF中实现操作重载

    参考地址:http://www.cnblogs.com/zhili/p/4039111.html 一.如何在Windows Services中寄宿WCF服务 第一步:创建Windows 服务项目,具体 ...

  5. 重温WCF之构建一个简单的WCF(一)(1)通过控制台和IIS寄宿服务

    一.理解什么是WCFWCF就是.NET平台下各种分布式技术的集成,并提供了一套统一的编程接口 二.WCF的定义WCF(Windows Communication Foundation)是微软为构建面向 ...

  6. 构建一个简单的WCF应用——WCF学习笔记(1)

    通过<WCF全面解析>来知识分享....感谢蒋金楠老师@Artech 一.VS中构建解决方案   Client一个控制台程序模拟的客户端,引用Service.ServiceModel.dl ...

  7. [WCF学习笔记] 我的WCF之旅(1):创建一个简单的WCF程序

    近日学习WCF,找了很多资料,终于找到了Artech这个不错的系列.希望能从中有所收获. 本文用于记录在学习和实践WCF过程中遇到的各种基础问题以及解决方法,以供日后回顾翻阅.可能这些问题都很基础,可 ...

  8. WCF服务二:创建一个简单的WCF服务程序

    在本例中,我们将实现一个简单的计算服务,提供基本的加.减.乘.除运算,通过客户端和服务端运行在同一台机器上的不同进程实现. 一.新建WCF服务 1.新建一个空白解决方案,解决方案名称为"WC ...

  9. laravel学习:php写一个简单的ioc服务管理容器

    php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...

随机推荐

  1. 或许因为缺少默认route配置而导致的的ping超慢,甚至timeout

    内网有台dell r620 做测试用: 4个网口都插了 网线,通过小交换直接连在中心路由的第3个口上: 安装了kvm,有virbr0   :但还没装其它的虚拟机. ping 外网域名 ,IP地址 都超 ...

  2. anaconda使用以及创建python3.7+pytorch1.0虚拟环境以及Jupyter notebook初级使用

    查看所有已安装的软件包$ conda list# packages in environment at S:\Users\jiangshan\Anaconda3:## Name Version Bui ...

  3. css 常用单位

    em: 相对于应用在当前元素的字体尺寸,1em 等于当前的字体尺寸,2em 等于当前字体尺寸的两倍,一般浏览器字体大小默认为16px,则2em == 32px: W3原文:font size of t ...

  4. Leetcode——338. 比特位计数

    题目描述:题目链接 对于求解一个十进制数转化为二进制时里面1的个数,可以先看一下概况: 十进制数 二进制数 1的个数 1 1    1 2 10 1 3 11   2 4 100 1 5 101 2 ...

  5. React Native创建一个APP

    React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用.在 JavaScript 中用 React 抽 ...

  6. vue中的img src 动态加载本地json的图片路径写法。

    目录: 注意:本地json文件和json文件里的图片地址都必须写在static 静态文件夹里:否则json文件里的url地址找不到. major_info.json文件里的图片路径写法 页面通过v-b ...

  7. 20155223 实验5 MSF基础应用

    20155223 实验5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode? exploit:漏洞攻击.一个exploit程序肯定会触发系统的一个或多个漏 ...

  8. 20155323刘威良《网络对抗》Exp3 免杀原理与实践

    20155323刘威良<网络对抗>Exp3 免杀原理与实践 实践内容 1 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellco ...

  9. POJ 2299

    上课讲了下数据结构,因为暂时没找到分块的板子题,所以做一下这道题加深一下对树状数组的理解. 题意就是求逆序对,从逆序对的定义就可以看出,方法有两种:归并 or 树状数组. 感觉树状数组更高级一点,写起 ...

  10. mysql安装版多次安装导致安装失败的解决方法(windows)(直接使用免安装方法)

    https://www.cnblogs.com/feilongblog/p/mysql_install_init.html 测试成功 要点:mysqld install MySQL --default ...