年前辞职-WCF入门学习(3)

前言

[2了,刚写好的,手贱,点了删除,还真TMD的删除了,只好重写]

今天周六,去同事家聚了一个餐,感觉各种豪华。

废话不多说,前两集大致介绍了一下什么是WCF以及和WCF相关的WebService和.net Remoting的一些东西,今天主角要上场,开始WCF的实现相关的东西。

第三集 Create a WCF Service

挂了vpn来看youtube的视频,感觉还是慢,算了,干脆下载了看。

这一集主要有以下四个点

  • 创建一个WCF服务

  • 用一个控制台程序来托管这个服务
  • 提供两个Endpoint
  • 创建一个windows 和一个 Web客户端程序

先上一张上一集的图,

从图中可以看到,为了给java 和.net 两个客户端提供他们需要的服务,我们需要实现两个东西,一个是WebService   一个是 .net Remoting ,虽然他们的功能是一样的。

接下去是WCF的实现方式:

从图中可以知道,我们只需要写一个服务,然后配置两个Endpoint即可满足需求。

Let ‘s do IT。

首先,创建一个解决方案,添加一个新类库,取名HelloService

然后,删除vs 自动生成的Class1.cs 再添加一个WCF服务 新项(右上角可以搜索)取名HelloService。

确定之后我们看一下项目目录结构。

首先是引用这块。vs 自动添加了对System.ServiceModel 命名空间的引用,这个是WCF的核心命名空间。

然后是vs生成了2个文件,一个HelloService  一个 IHelloService。

让我们来看一下这两个文件。

首先是IHelloService文件

    [ServiceContract]
    public interface IHelloService
    {
        [OperationContract]
        void DoWork();
    }

看名字就知道这是一个接口,接口所具有的ServiceContract 特性来自于ServiceModel 命名空间,接口里面包含一个方法定义,DoWork(),方法有一个OperationContract特性也是来自ServiceModel 。

接下去是HelloService文件

    public class HelloService : IHelloService
    {
        public void DoWork()
        {
        }
    }

只是简单的实现了IHelloService 接口。

现在,我们对两个文件做些修改,来实现我们自己的服务。

把IHelloService 改成如下:

    [ServiceContract]
    public interface IHelloService
    {
        [OperationContract]
        string GetMessage(string name);
    }

即删除了原先的DoWork方法,改成一个返回String类型的GetMessage方法,传入一个name参数。

相应的,HelloService也要变。

    public class HelloService : IHelloService
    {
        public string GetMessage(string name)
        {
            return "Hello " + name;
        }
    }

我们实现了里面的GetMessage方法,让他返回我们需要字符串。

至此,创建工作就已完成,接下去就是在控制台程序中托管这个服务。需要说明一点,WCF的托管对象可以是Winform,Console ,或者IIS,或者windows 服务以及其他。为了简化问题,这里选中托管到Console中。

首先,在当前解决方案中新添加一个控制台项目,取名HelloServiceHost

点击确定,

然后,要对这个Host添加两个引用,一个上面的System.ServiceModel,另一个是上面的WCF项目。

然后会得到如下的引用目录。

为了托管这个WCF服务,我们需要给项目添加一个配置文件,用于托管这个WCF服务。

右键Host项目,选择添加新项,应用程序配置文件,名字就是默认的App.config

重头戏来了,写这个配置文件,然他可以给两个不同的客户端提供服务。

完整版如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="HelloService.HelloService" behaviorConfiguration="mexBehavior">
        <endpoint address="HelloService" binding="basicHttpBinding" contract="HelloService.IHelloService"></endpoint>
        <endpoint address="HelloService" binding="netTcpBinding" contract="HelloService.IHelloService"></endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080"/>
            <add baseAddress="net.tcp://localhost:8090"/>
          </baseAddresses>
        </host>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="mexBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>
</configuration>

解释一下,首先是这个endpoint,他有3个参数,很好记,缩写ABC。

  • Address 地址,用来指定服务的位置。注意,如果没有特殊描述,那么就是一个相对地址,实际的地址由下面的baseAddress+address构成。

  • Binding 绑定,给出了协议和编码信息,详细的编码列表如下。 如图在serviceModel节点下面输入一个bindings元素,然后输入一个小于号,就可以看到所有的列表。我们前期如果不熟悉用什么,可以用这种方式来复制粘贴到endpoint里面
  • Contract 协议,定义了服务提供的操作。具体的内容就是我们定义的IHelloService WCF服务所在位置,即他的命名空间HelloService + 名字 IHelloService = HelloService.IHelloService。

endpoint根据需要,我们只要定义2个,但是,一般来说,我们会再定义一个用于元数据交换的mex 端点,关于什么这个端点的作用,如果你写过WebService,知道WSDL,那就很好理解了,他就是WCF中的WSDL,用来描述服务的操作很消息。

上面说了,我们用的endpoint里面的地址是相对地址,所以要定义一个baseAddresses,在host元素里面,里面两个baseAddress,一个http协议的地址,一个tcp协议的地址。

接着是behaviors节点,里面定义了serviceMetadata是否允许httpGet

配置文件方面介绍完毕,下面要在控制台中托管这个服务。

打开program.cs ,

因为原先已经引用过system.ServiceModel 命名空间,所以编写如下代码:

        static void Main(string[] args)
        {
            using(var host = new ServiceHost(typeof(HelloService.HelloService))) {
                host.Open();
                Console.WriteLine("Host 在" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "启动");
                Console.ReadLine();//防止控制台程序自动关闭
            }
        }
然后运行该Host,得到如下界面。
 

可知,host已经启动生效。

自己在写的时候碰到个问题,

如果vs不是以管理员方式运行,会得到下面这个异常提示:

提示无权访问这个命名空间。所以,只要重启vs,并且以管理员方式运行即可。

启动了Host之后,接下来就要调用了。

java没有装,所以就用web项目来代替了。

重新打开一个vs,记得以 管理员 方式运行,新建一个网站,简单起见,就用aspx网站。然后给该网站添加服务引用。

因为上面已经启动了Host,输入地址http://localhost:8080 点击转到,得到一个服务,然后把命名空间改成HelloService,点击确定,然后我们看一下根目录下的web.config 文件。

    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IHelloService" />
            </basicHttpBinding>
            <netTcpBinding>
                <binding name="NetTcpBinding_IHelloService" />
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8080/HelloService" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IHelloService" contract="HelloService.IHelloService"
                name="BasicHttpBinding_IHelloService" />
            <endpoint address="net.tcp://localhost:8090/HelloService" binding="netTcpBinding"
                bindingConfiguration="NetTcpBinding_IHelloService" contract="HelloService.IHelloService"
                name="NetTcpBinding_IHelloService">
                <identity>
                    <userPrincipalName value="此处省略~~" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>

可以看到,config里面添加了一个serviceModel 节点,内容是我们前面定义的binding 和 endpoint。

右键该网站然后新添一个页面,然后添加一个textbox,一个button,一个label,得到如下:

button的Text 改成GetMessage,然后给click添加事件。

内容如下:

        var client = new HelloServiceClient("BasicHttpBinding_IHelloService");
        Label1.Text = client.GetMessage(TextBox1.Text);

先构造一个服务的实例,然后调用服务给我们提供的GetMessage方法,运行该网站。

输入内容,点击GetMessage,下面的lebel内容就变成了我们服务返回的结果。

Http调用的介绍完毕,视频还举了第二个winform的例子,和webform的基本一样,就不贴出来了。

我也想知道tcp是怎么调用的,但是视频上没说,今天太迟了,有空再google一下吧。

Thankyou!

时间: 2024-11-03 20:59:24

年前辞职-WCF入门学习(3)的相关文章

年前辞职-WCF入门学习(1,2)

前言 周一的时候辞职了,离开了从12年毕业后8月份开始一直到现在的公司. 辞职之后当然是玩.玩了若干天的游戏,真的是没日没夜啊,但是玩的太坑,怒删游戏.话说上次玩还是在14年7月份.下次还是过年回家再和小伙伴一起玩.想到过年也就7天的假.... 21号驾照考试,考完22号去新公司报到. 新公司WCF用的比较多,以前纯粹站在了使用者的角度,自己是没写过,想到如果去了之后技能不过关,没过试用期就被fired了的话不太好. 优酷上找了一下,没有太好看的WCF教程,先不说内容,对我来说那种不是wuma

年前辞职-WCF入门学习(4)

前言 上一篇的学习中碰到一个问题,用地址http://localhost:8080/mex 访问元数据的时候一直提示400 bad request 错误,因为时间太晚了,查了好几遍代码,也没有发现问题.刚刚又试验了一下,解决方案分两步 ①用管理员方式运行vs, ② 将 <serviceMetadata httpGetEnabled="true" /> 改成 <serviceMetadata httpGetEnabled="true" httpGet

年前辞职-WCF入门学习(5)

前言 第五集比较简单,视频也只有7分多钟,但是用处还是挺大的.下面我会介绍. 本来想第六集一起介绍的,后来发现第六集内容比较多,有半个多小时,就不一起了.网站规定6小时内只能发布一篇文章到首页,,那我就11点再发布吧. 第五集 How to make changes to WCF service without breaking clients (在不修改客户端的情况下更新WCF服务) 这集的大部分代码用的是第三集的内容.他的场景是这样的:假设我们已经写好了服务,但是某天重构代码的时候发现有个S

年前辞职-WCF入门学习(6)

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace EmployeeService 7 { 8 public class Employee 9 { 10 private int _id; 11 private string _name; 12 private bool _gender; 13 private DateTime _dat

年前辞职-WCF入门(6)

前言 昨天早上去医院做入职体检,被告知要预约,本以为是要排队,我连视频都准备好了...结果就回来了.下午去了新公司那边找房子,2了,因为公司提供了班车列表,我既然就只在班车所经过的几个地方找,却遗漏了公司附近这个重要的地址.最后找了一个“江景房”,上阳台就能看到钱塘江.价格和现在的比翻了一倍,累了,不想找了. 有朋友让我把标题前缀“年前辞职”4个字拿了,好吧,我承认,我就是靠这个吸引一部分眼球的. 第六集 WCF DataContract & DataMember (WCF的Data和DataM

菜鸟级别的WCF入门学习

这两天学习WCF,看了MSDN上的入门教程,和查找了一些网上给的例子,简单的实现了一下,感觉应该很适合我这种菜鸟级的选手看了. 1.新建一个项目--WCF--WCF服务应用程序 用的是MSDN上的加减乘除,所以在名称部分写的是Calculator 删除自带的Service1和IService1两个文件,右键添加--新建项 由于左侧的选项里没有WCF,所以直接搜索WCF,添加WCF服务,名字为Cal 删除或注释掉Cal里的 //public void DoWork() //{ //} ICal里的

WCF入门教程

无废话WCF入门教程一[什么是WCF] wcf问题有问必答,欢迎加群: 一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NET Framework 3.0 开始引入. WCF的最终目标是通过进程或不同的系统.通过本地网络或是通过Internet收发客户和服务之间的消息. WCF合并了Web服务..net Remoting.消息队列和Enterpris

WCF 入门(25,26,27,28)

前言 项目赶时间,工期紧,熬过这段时间应该就好了吧.希望如此. 今天把自己那部分写的差不多了,回来和小伙伴一起又看了一遍<夏洛特烦恼>,还挺好看的,明天继续加班,do it. 第25-28集 第25集讲的是如何用winform来host 一个WCF service. 第26集讲什么是windows 服务 第27集讲用windows 服务来host 一个WCF service. 第28集讲用windows 服务来host 一个WCF service的优缺点. 用console,winform 或

WCF入门简单教程(图文) VS2010版

在这个例子中我们将使用VS 2010 创建一个WCF服务,其中会了解 [DataContract] [ServiceContract] 等特性.  内置的 WCFSVCHost ,并使用"WCF测试客户端"来测试我们创建的服务. 注意下面的所有类.接口及方法都添加了public 的访问级别. 一,建立一个WCF服务库 创建一个WCF服务库项目 在解决方案中会自动为我们生成两个类文件"IService1.cs"和"Service1.cs". 这两个