• WCF系列教程之初识WCF


    本随笔参考自WCF编程系列(一)初识WCF,纯属读书笔记,加深记忆。

    1、简介:Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型。在WCF之前,.NET Framework提供了多种分布式技术,如ASP.NET Web服务、.NET Framework远程处理、企业服务、WSE以及Microsoft消息队列。一般我们在编写一个应用程序时通常会同时使用多项技术,所以,微软将这些分布式应用程序集成到了一起,形成了WCF这个框架。即通过WCF能实现上面所有的分布式功能。

    2、WCF的基本组成

    (1)、地址:定义服务的地址,也就是服务接口所在地的IP地址

    (2)、绑定:定义服务的通讯方式(传输协议、编码方案)

    (3)、契约:定义服务的具体实现

    (4)、终结点(endpoint):由地址、绑定、契约共同构成一个终结点,服务器通过终结点向客户端公开服务,客户端通过终结点来调用服务。

    注:WCF是面向接口编程

    3、简易demo

    (1)、第一步

    i、首先创建一个IService类库(服务层)。

    ii、引用引入System.ServiceModel命名空间和当前解决方案的Service命名空间和IService命名空间

    iii、然后在服务层下面新建一个服务接口IUserInfoService,并在该接口上添加[ServiceContract]特性(及服务契约),表明该接口是一个服务

    iiii、在接口中定义Add方法,并在方法上添加[OperationContract]特性,表示Add方法是IUserInfoService服务接口的一个服务方法,客户端可远程调用该方法

    复制代码
    using System;
    using System.ServiceModel;
    
    namespace IService
    {
        [ServiceContract]
        public interface IUserInfoService
        {
            [OperationContract]  //相当于WebService中的[WebMethod]特性标签
            int Add(int a, int b);
        }
    }
    复制代码

    (2)、第二步

    i、创建一个Service类库(服务层的具体实现)

    ii、实现服务层中的所有方法

    复制代码
    using System;
    using IService;
    
    namespace Service
    {
        public class UserInfoService : IUserInfoService
        {
            public int Add(int a, int b)
            {
                return a + b;
            }
        }
    }
    复制代码

    ok,到这里服务端的WCF服务创建完成

    (3)、第三步,个人觉得是WCF最重要的一步,同时也是提现它功能强大的地方之一,提供WCF服务的宿主(它的宿主可以使任何应用程序,包括Web应用程序、控制台、Windows Form程序),这里使用控制台程序。

    宿主程序:WCF通过改程序向外部发布服务,也就是说改程序必须保持启动的状态,否则WCF中的服务,外界将无法获取。

    i、创建一个控制台程序Host,作为WCF的宿主程序

    ii、引入System.ServiceModel命名空间和IService命名空间和Service命名空间

    iii、通过下面的代码启动WCF服务

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.ServiceModel;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Host
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (ServiceHost host = new ServiceHost(typeof(Service.UserInfoService))) {
                    host.Open();
                    Console.WriteLine("服务器启动成功");
                    Console.ReadLine();
                }
            }
        }
    }
    复制代码

    当然,现在肯定启动不了,因为最重要的配置文件,还没有设置。使用WCF大部分时间,都在配配置文件。

    (4)、第四步,编写WCF宿主的配置文件app.config,来配置我们的WCF程序

    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <service name="Service.UserInfoService" behaviorConfiguration="behaviorConfiguration">
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8000/"/>
              </baseAddresses>
            </host>
            <endpoint address="" binding="basicHttpBinding" contract="IService.IUserInfoService"></endpoint>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="behaviorConfiguration">
              <serviceMetadata httpGetEnabled="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    复制代码

    ok,所有的准备工作都以就绪,现在重新生成整个解决方法。右键Host,打开其本地文件夹,找到Host.exe程序,启动服务,注意不要关闭。

    (5)、第五步,测试WCF服务是否能正常使用,有两种方法可供测试

    i、打开浏览器输入服务地址:http://localhost:8000/,这个地址是我们在app.config文件中配置的UserInfoService服务的地址

    ok,说明WCF服务端已经启动客户端可以正常调用

    ii、使用vs2010以上的自带的WCF测试工具,通过这个工具,也可以测试当前服务是否正常启动。

    输入服务地址,点击确定。

    说明服务正常启动。

    (6)、第六步,客户端访问,在确认服务端正常启动后,下面就要通过客户端来测试服务能否正常调用

    i、创建一个名为Client的客户端控制台程序

    ii、生成客户端代理类,通过代理类来调用服务端程序,生成客户端代理类有两种方式(我知道的),

        第一种:通过微软的svcutil工具生成UserInfoService服务的客户端代理类,开始菜单/Microsoft Visual Studio 2012/Visual Studio Tools/Visual Studio 2012开发人员命令提示

    打开该工具,在工具中定位到当前需要调用WCF服务的客户端目录下,然后输入

    svcutil http://服务地址/?wsdl /o:客户端文件名.cs,,回车,在回车前需确认WCF服务端是开启的。回到Client项目,选择添加 现有项 ,然后选择这两个文件,添加后,将output.config重命名为App.config,ok,文件初始化完成,第一种方法介绍完毕,下面通过代码测试,代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Client
    {
        class Program
        {
            static void Main(string[] args)
            {
                UserInfoServiceClient client = new UserInfoServiceClient();
                Console.WriteLine(client.Add(1, 2));
            }
        }
    }

    ok,说明Client调用WCF服务成功!

      第二种方法:这种方法,仅限于Web客户端的调用,新建一个空Web应用程序,右击添加服务引用

    ,输入服务地址http://localhost:8000/,点击添加。

    ok,客户端代理类添加成功。下面通过代码测试,当前Web项目能否正常使用WCF服务端服务,新建Web窗体,修改后台代码如下:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Web.ServiceReference1;
    
    namespace Web
    {
        public partial class WebForm1 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                UserInfoServiceClient client = new UserInfoServiceClient();
                Response.Write(client.Add(1, 2));
            }
        }
    }
    复制代码

    运行当前窗体,,ok,说明everything is ok.

  • 相关阅读:
    牛客OI周赛13-提高组 比赛总结
    CF1260C Infinite Fence 题解(扩欧)
    Comet OJ
    CF1151F Sonya and Informatics (计数dp+矩阵优化)
    矩阵 总结
    Educational Codeforces Round 77 比赛总结
    Codeforces 矩阵题 题单
    01欢迎进入软件构建的世界
    02用隐喻来充分地理解软件开发
    02Vs2013常用路径配置
  • 原文地址:https://www.cnblogs.com/GreenLeaves/p/6842585.html
Copyright © 2020-2023  润新知