[Solution] WCF(1) 快速入门

  Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。是Windows平台上开发分布式应用最佳的实践方式。

  安装:在.net framework 3.0的时候已经内置了WCF。

  由于WCF的服务不能孤立地存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程称为宿主。在本节将介绍2种服务寄宿服务,并分别通过Code和Config的方式为WCF服务绑定endpoint:

  • 自我寄宿(*.exe)
  • IIS寄宿(w3wp.exe)
  • Config

自我寄宿

1.建立项目

  • Service一个控制台应用,实现对wcf服务的寄宿,该项目引用System.ServiceMode程序集。(WCF框架的绝大部分实现和API定义在该程序集中)
  • Client一个控制台应用,实现对服务的调用端,该项目引用System.ServiceMode程序集。(生成的代理类继承自该程序集)

2.创建契约(contract)

  WCF包含四种类型的契约:服务契约、数据契约、消息契约和错误契约。这里所指服务契约,用来声明服务的所有操作。

  要使一个接口成为一个契约,需要为其贴上特性标签。

using System.ServiceModel;

namespace Service
{
    [ServiceContract]
    public interface ICar
    {
        [OperationContract]
        string Run(int distance);
    }
}

  

3.实现服务

  实现接口方法即可

namespace Service
{
    public class CarService : ICar
    {
        public string Run(int distance)
        {
            return "行驶了" + distance;
        }
    }
}

4.开始寄宿

  WCF采用终结点的通信方式。终结点包括Address,Binding,Contract,简称ABC。

Address:  指定wcf的location

Binging:  指定传输协议。(tcp http msmq等)

Contract:  指定服务的Behavior。

using System;
using System.ServiceModel;

namespace Service
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var host = new ServiceHost(typeof(CarService)))
            {
                //指定服务的终结点,分别指定Contract,Binding,Address
                host.AddServiceEndpoint(typeof(ICar), new BasicHttpBinding(), "http://localhost:10000/Car");
                host.Open();
                Console.WriteLine("服务启动成功");
                Console.Read();
            }
        }
    }
}

(已管理员身份启动Service.exe)

服务以及寄宿成功,那我们怎么调用呢。实际上,这样的方式是无法被调用的。客户端引用的地址是服务的元数据。所以我们需要把服务的元数据暴露出来。

using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Service
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var host = new ServiceHost(typeof(CarService)))
            {
                if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
                {
                    //服务的元数据 允许Get方式从下面的Url中获取
                    var behavior = new ServiceMetadataBehavior
                    {
                        HttpGetEnabled = true,
                        HttpGetUrl = new Uri("http://localhost:10000/Car/Metadata")
                    };
                    host.Description.Behaviors.Add(behavior);
                }
                //指定服务的终结点,分别指定Contract,Binding,Address
                host.AddServiceEndpoint(typeof(ICar), new BasicHttpBinding(), "http://localhost:10000/Car");
                host.Opened += (o, e) => Console.WriteLine("服务启动成功");
                host.Open();
                Console.Read();
            }
        }
    }
}

5.服务的调用

  服务的调用有2种方式,VS引用服务生成代理类,Code自定义代理类(需要保证Endpoint完全一致)。

Code自定义代理类:

using System;
using System.ServiceModel;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            //一致的终结点
            using (var channelFactory = new ChannelFactory<ICar>(new BasicHttpBinding(), "http://localhost:10000/Car"))
            {
                //手动创建代理类
                var proxy = channelFactory.CreateChannel();
                Console.WriteLine(proxy.Run(3));
            }
            Console.Read();
        }
    }
}

这里面的ICar(Contract),并非一定和wcf服务的ICar完全一致(指命名空间,所在程序集名称),只需方法签名一致即可。(由于是Contract仍需对应的特性)

using System.ServiceModel;

namespace Client
{
    [ServiceContract]
    interface ICar
    {
        [OperationContract]
        string Run(int distance);
    }
}

在管理员运行前面的Service.exe基础上,运行Client.exe。

IIS寄宿

1.建立项目

2.文件结构

3.svc文件

svc文件相当于asmx文件,通过一个必须指令Service,指定具体的服务。如Service="WcfService.Service1"

在vs中,浏览器查看svc文件,svc的地址就是服务的地址。svc的地址+?wsdl是服务描述的地址。

4.服务的调用

和自我寄宿的服务类似,只用将Address改成svc的地址即可。

注意,在新建svc文件的时候,vs会自动修改Web.config文件。(用来指定服务的元数据暴露行为)

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">//指定默认的behavior
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Config

以上基本均采用Code的方式实现WCF,实际上WCF非常灵活,一般都采用Config方式。或者Config+Code(都会生效)。

wcf的配置涉及到2种,服务的发布,服务的调用。

发布:

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="meta">
          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:10001/Car/Metadata"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="Service.CarService" behaviorConfiguration="meta">
        <endpoint address="http://localhost:10001/Car" binding="wsHttpBinding" contract="Service.ICar"></endpoint>
        <endpoint address="http://localhost:10001/Car2" binding="wsHttpBinding" contract="Service.ICar"></endpoint>
      </service>
    </services>
  </system.serviceModel>

调用:

<system.serviceModel>
    <client>
      <endpoint name="car" address="http://localhost:10001/Car" binding="wsHttpBinding" contract="Client.ICar"></endpoint>
    </client>
  </system.serviceModel>

当调用端采用配置方式的时候,代码改成如下方式调用。(配置中name用来区分不同的endpoint,代码中也使用对应的name创建信道栈Channel)

using System;
using System.ServiceModel;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var cf = new ChannelFactory<ICar>("car"))
            {
                Console.WriteLine(cf.CreateChannel().Run(3));
                Console.Read();
            }
        }
    }
}

上述内容概述了wcf Code和Config2种方式。在实际开发中,可以更简单通过vs的引用服务生成代理类,配置wcf服务工具修改*.config。本文就不再赘述了。

代码下载:等待整理

本文作者:Never、C

本文链接:http://www.cnblogs.com/neverc/p/4682394.html

时间: 2024-11-09 03:41:32

[Solution] WCF(1) 快速入门的相关文章

快速入门系列--MVC--01概述

虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的DI依赖注入概念和注册表模式(GetService)等内容,ExceptionFilter等过滤器就体现AOP的概念,整个MVC内置了一个IOC容器,基本上所有的框架类的对象都是通过这种方式来创建的.此外,一直觉得很j2ee的spring很棒,其实如果大家很熟悉EHAB(微软企业开发库)的话,就会发

快速入门系列--WebAPI--03框架你值得拥有

接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI,其核心概念就是构建REST风格的Web服务,把一起数据视为资源,无论是服务请求或者是数据操作,与以前的SOAP和XML-RPC架构风格有很大不同.说道这,很多读者可能想到WCF中不是早都有了REST风格的服务么,为什么还需要这个WebAPI?确实如此,不过WCF中的该类型服务显得比较复杂,因为其通

快速入门系列--WebAPI--01基础

ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因此两者相关类的命名空间有细微差异,在使用时需要注意. WebAPI学习系列目录如下,欢迎您的阅读! 快速入门系列--WebAPI--01基础 快速入门系列--WebAPI--02进阶 快速入门系列--WebAPI--03框架你值得拥有 快速入门系列--WebAPI--04在老版本MVC4下的调整 W

Expression Blend实例中文教程(2) - 界面快速入门

上一篇主要介绍Expression系列产品,另外概述了Blend的强大功能,本篇将用Blend 3创建一个新Silverlight项目,通过创建的过程,对Blend进行快速入门学习. 在开始使用Blend前,首先需要进行Silverlight的开发环境搭建,在银光中国网(SilverlightChina.Net)有篇"轻松建立Silverlight开发环境",其中列出了建立Silverlight开发环境的几个步骤,另外,我在过去发布过一篇"Silverlight开发工具集合&

.Net Core 3.0 IdentityServer4 快速入门

原文:.Net Core 3.0 IdentityServer4 快速入门 .Net Core 3.0 IdentityServer4 快速入门 一.简介 IdentityServer4是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架. 将IdentityServer4部署到您的应用中具备如下特点: 1).认证服务 2).单点登陆 3).API访问控制 4).联合网关 5).专注于定制 6).成熟的开源系统 7).免费和商业支持 二.整体部署 目前大多数的应用

笔记:Spring Cloud Zuul 快速入门

Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了所有其他微服务的实例信息,这样的设计非常巧妙的将服务治理体系中维护的实例信息利用起来,使得维护服务实例的工作交给了服务治理框架自动完成,而对路由规则的维护,默认会将通过以服务名作为 ContextPath 的方式来创建路由映射,也可以做一些特别的配置,对于签名校验.登录校验等在微服务架构中的冗余问题

javaweb-html快速入门

本文主要是进行HTML简单介绍(详细的属性查帮助文档就行了,这里主要为快速入门,赶时间,在最短的时间中看明白一个html文件的代码(如果能称之为代码的话)详细的样式表,布局啥的有时间再研究吧) HTML 1.html的简介 1.1,html的全称:HyperText Mark-up Language ,超文本标记型语言,是网页的语言. 超文本:比文本更加强大(后面还会讲到XML,可扩展标记性语言) 标记:就是标签,html所有操作都是通过标签直接或间接的操作(把需要操作的数据通过标签封装起来)

crosswalk 快速入门,利用WebRTC(html)开始开发视频通话

crosswalk 快速入门,利用WebRTC(html)开始开发视频通话 安装Python 从http://www.python.org/downloads/ 下载安装程序 安装完后,再添加到环境变量. 安装Oracle JDK 下载页面: http://www.oracle.com/technetwork/java/javase/downloads/ 选择要下载的Java版本(推荐Java 7). 选择一个JDK下载并接受许可协议. 一旦下载,运行安装程序. 安装Ant Ant:下载http

bash编程快速入门

首先,我们简单的介绍一下bash,bash是GNU计划编写的Unixshell,它是许多Linux平台上的内定shell,它提供了用户与系统的很好的交互,对于系统运维人员,bash的地位是举足轻重的,bash编程能很快处理日常的任务 bash入门,一个最简单的bash例子 #vim hello.sh #!/bin/bash #This is the first example of the bash #echo "Hello world" 下面,我们就这个简单的bash 脚本来介绍一下