一、WCF是什么?

  Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有Http和Ftp的相关技术,是Windows平台上开发分布式应用最佳的实践方式。使用该框架,开发人员可以构建跨平台、安全、可靠和支持事务处理的企业级互联应用解决方案。

二、WCF的优势

  1.统一性

  WCF涵盖了之前微软推出的所有用于分布式开发的技术,包括Remoting、Web Services、WSE、MSMQ等,并以一种统一的编程模式来实现。

  2.互操作性

  WCF最基本的通信机制是SOAP(Simple Object Access Protocol 简易对象访问协议),这就保证了系统之间的互操作性,也能够实现.NET客户端与.NET服务端的通信,提供了分布式事务的支持。

  3.安全性和可靠性

  WCF在安全性上,它完全遵循了WS-*的标准,在SOAP 的header中增加了WS-ReliableMessaging允许可信赖的端对端通信。而建立在WS-Coordination和WS- AtomicTransaction之上的基于SOAP格式交换的信息,则支持两阶段的事务提交(two-phase commit transactions)。

  4.兼容性

  WCF充分的考虑到了与旧有系统的兼容性。安装WCF并不会影响原有的技术如ASMX和.Net Remoting。即使对于WCF和ASMX而言,虽然两者都使用了SOAP,但基于WCF开发的应用程序,仍然可以直接与ASMX进行交互。

特性

Web Service

.NET Remoting

Enterprise Services

WSE

MSMQ

WCF

具有互操作性的Web服务

支持

支持

.NET到.NET的通信

支持

支持

分布式事务

支持

支持

支持WS标准

支持

支持

消息队列

支持

支持

三、WCF简单示例

  1.建立解决方案

  

WCF.Host需引用WCF.Service,WCF.HostByWeb引用WCF.Service

  2.WCF.Service项目:

  

IHelloWorldService.cs文件:
   [ServiceContract(Namespace="www.cnblogs.com")]
public interface IHelloWorldService
{
[OperationContract]
string SayHello(string str); [OperationContract]
Student Say();
} [DataContract]
public class Student
{
[DataMember]
public string UserName { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public GenderMode Gender { get; set; } } public enum GenderMode
{
Man = ,
Woman = ,
UnKnown =
}
HelloWorldService.cs
public class HelloWorldService : IHelloWorldService
{
public string SayHello(string str)
{
return "您说了:" + str;
} public Student Say()
{
Student stu = new Student()
{
UserName = "zxj",
Age = ,
Gender = GenderMode.Man
};
return stu;
}
}

  3.WCF.Host(以控制台程序作为宿主)

    1.以配置文件的方式配置终结点

Program.cs文件
class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(WCF.Service.HelloWorldService));
Console.ForegroundColor = ConsoleColor.DarkYellow; host.Open();
Console.WriteLine("服务启动成功......"); int i = ;
foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
{
i++;
Console.WriteLine("终结点序号:{0},终结点名称:{1},终结点地址:{2},终结点绑定:{3}{4}",i, endpoint.Name, endpoint.Address, endpoint.Binding,Environment.NewLine);
} Console.Read();
}
}

  App.config文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<services>
<service name="WCF.Service.HelloWorldService">
<endpoint address="http://localhost:8000/HelloWorldService" contract="WCF.Service.IHelloWorldService" binding="wsHttpBinding"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000"/>
</baseAddresses>
</host>
</service> </services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

    2.以编程方式配置终结点

class Program
{
static void Main(string[] args)
{
//编程方式配置终结点
Uri baseAddress = new Uri("http://localhost:8000");
ServiceHost host = new ServiceHost(typeof(WCF.Service.HelloWorldService), baseAddress);
WSHttpBinding binding = new WSHttpBinding();
//寻找元数据
ServiceMetadataBehavior metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
//获取宿主的行为列表
if (metadataBehavior == null)//如果没有服务原数据交换的行为,实例化添加服务原数据交换行为
{
metadataBehavior = new ServiceMetadataBehavior();
metadataBehavior.HttpGetEnabled = true;
host.Description.Behaviors.Add(metadataBehavior);
} host.AddServiceEndpoint(typeof(WCF.Service.IHelloWorldService), binding, "HelloWorldService");
host.AddServiceEndpoint(typeof(IMetadataExchange), binding , "mex"); Console.ForegroundColor = ConsoleColor.DarkYellow; host.Open();
Console.WriteLine("服务启动成功......"); int i = ;
foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
{
i++;
Console.WriteLine("终结点序号:{0},终结点名称:{1},终结点地址:{2},终结点绑定:{3}{4}", i, endpoint.Name, endpoint.Address, endpoint.Binding, Environment.NewLine);
} Console.Read();
}
}

  4.WCF.Client(客户端,控制台程序),需要添加System.Runtime.Serialization和System.ServiceModel引用

  这里使用svcutil.exe,生成服务端代理类,使用方法如下:

  Visual Studio ——>菜单栏——>工具——>外部工具

启动宿主程序,最好使用右键——以管理员的身份打开控制台宿主程序

宿主程序启动后,打开svcutil.exe程序,

Visual Studio ——>菜单栏——>工具——>SvcUtil(这是前一步配置外部工具时svcutil.exe的标题)

打开之后如图所示,填入宿主元数据地址:

点击确定,

如果你在配置外部工具时,选择和我一样的配置,你可以在解决方案根目录下找到HelloWorldService.cs和output配置文件,将HelloWorldService.cs直接复制到WCF.Client项目中,打开output配置文件,将里面的内容复制到WCF.Client项目中App.config配置文件相应的地方

  Program.cs

class Program
{
static void Main(string[] args)
{
HelloWorldServiceClient client = new HelloWorldServiceClient();
string temp = client.SayHello("你好!");
Console.WriteLine(temp); Student stu = client.Say();
Console.WriteLine("用户名:" + stu.UserName + ",年龄:" + stu.Age + ",性别:" + stu.Gender); Console.Read();
}
}

生成解决方案,先运行宿主控制台应用程序,再运行客户端控制台程序,客户端控制台程序结果如下图所示:

至此,基于控制台应用程序的宿主相关示例已经结束。下面介绍,基于Web应用程序的宿主相关示例:

  5.WCF.HostByWeb(宿主,Web程序)

  新建“WCF 服务应用程序”,如图所示:

添加对WCF.Service项目的引用,删除IService1.cs,IService1.svc,新建WebHelloWorldService.svc页面

删除IWebHelloWorldService.cs和WebHelloWorldService.svc.cs文件,如图:

打开WebHelloWorldService.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfService2.WebHelloWorldService" CodeBehind="WebHelloWorldService.svc.cs" %>

修改为:

<%@ ServiceHost Language="C#" Debug="true" Service="WCF.Service.HelloWorldService" %>

主要是Service="WCF.Service.HelloWorldService"。

右键WebHelloWorldService.svc,在浏览器中浏览:

这时我得到的网址为:http://localhost:32797/WebHelloWorldService.svc。

6.WCF.ClientByWeb项目(客户端,控制台程序),需要添加System.Runtime.Serialization和System.ServiceModel引用

在这里与第4步一样,也是使用svcutil.exe工具,根据URL地址生成对应的数据,可以直接参考第4步。

注意:本示例代码,仅供参考不能用于实际开发。 

源文件下载:WCF入门示例.rar

[WCF编程]1.WCF入门示例的更多相关文章

  1. [WCF编程]3.WCF基础

    一.服务 服务是一组公开功能的集合. 服务内部包含了如语言.技术.版本与框架等概念,服务之间的交互只允许使用规定的通信模式 外界客户端并不知道服务内部的实现细节,所以WCF服务通常通过元数据的方式描述 ...

  2. [WCF编程]4.契约概述

    一.契约的基本概念 契约是消息参与者之间的约定.在SOA架构中,契约提供了服务通信所必需的元数据.契约用来定义数据类型,操作,消息交换模式和消息交换使用的传输协议.契约通常是在标准化平台中使用与编程语 ...

  3. WCF编程系列(五)元数据

    WCF编程系列(五)元数据   示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...

  4. C#面向服务编程技术WCF从入门到实战演练

    一.WCF课程介绍 1.1.Web Service会被WCF取代吗? 对于这个问题阿笨的回答是:两者在功能特性上却是有新旧之分,但是对于特定的系统,适合自己的就是最好的.不能哪一个技术框架和行业标准作 ...

  5. WCF编程系列(七)信道及信道工厂

    WCF编程系列(七)信道及信道工厂   信道及信道栈 前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的.消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 ...

  6. WCF编程系列(六)以编程方式配置终结点

    WCF编程系列(六)以编程方式配置终结点   示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...

  7. WCF编程系列(四)配置文件

    WCF编程系列(四)配置文件   .NET应用程序的配置文件 前述示例中Host项目中的App.config以及Client项目中的App.config称为应用程序配置文件,通过该文件配置可控制程序的 ...

  8. WCF编程系列(二)了解WCF

    WCF编程系列(二)了解WCF   面向服务     服务是复用进化的结果,起初的复用是函数,面向对象编程的出现使复用从函数上升到对象,随后面向组件编程又将复用从对象上升到组件,现在面向服务编程将复用 ...

  9. WCF编程系列(三)地址与绑定

    WCF编程系列(三)地址与绑定   地址     地址指定了接收消息的位置,WCF中地址以统一资源标识符(URI)的形式指定.URI由通讯协议和位置路径两部分组成,如示例一中的: http://loc ...

随机推荐

  1. ES7之Decorators实现AOP示例

    在上篇博文CoffeeScript实现Python装潢器中,笔者利用CoffeeScript支持的高阶函数,以及方法调用可省略括符的特性,实现了一个类似Python装潢器的日志Demo.这只是一种伪实 ...

  2. 再看Ajax

    再回顾Ajax相关的内容,再次梳理学习还是很有必要的,尤其是实际的开发中,ajax更是必不可少,仔细学习以便避免不必要的错误. 文章导读: --1.使用XMLHttpRequest---------- ...

  3. 用“MEAN”技术栈开发web应用(三)用mongodb搭建数据库

    上一篇介绍了如何用express搭建起服务端MVC的开发架构,本篇我们来详细介绍一下这个Model层,也就是数据库访问层.包含如何使用mongodb搭建数据库,以及如何使用mongoose来访问数据. ...

  4. 如何在没有域的环境中搭建AlwaysOn(二)

    对DBA而言,不需要域就可以搭建SQL Server AlwaysOn是Windows Server 2016中最令人兴奋的功能了,它不仅可以降低搭建的成本,而且还减少了部署和运维的工作量. 上篇博客 ...

  5. django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5

    前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzhen ...

  6. [ASP.NET MVC 小牛之路]13 - Helper Method

    我们平时编程写一些辅助类的时候习惯用“XxxHelper”来命名.同样,在 MVC 中用于生成 Html 元素的辅助类是 System.Web.Mvc 命名空间下的 HtmlHelper,习惯上我们把 ...

  7. EF:Oracle.DataAccess.Client.OracleException: ORA-12154: TNS:could not resolve the connect identifier specified

    报告错误:Oracle.DataAccess.Client.OracleException: ORA-12154: TNS:could not resolve the connect identifi ...

  8. Objective-C 工厂模式(上) -- 简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂 ...

  9. 程序员的又一春,微信小程序带来的一个赚钱机遇

    微信小程序可能是原生的机遇,在程序员面对微信小程序的恐惧中说其实也是我们程序员创业的春天或者挣外快的一个机遇. 为什么这么说呢?且听我慢慢给你分析 成本角度 你想想,会ios开发的可能只会ios,会安 ...

  10. 生成模型(Generative Model)与判别模型(Discriminative Model)

    摘要: 1.定义 2.常见算法 3.特性 4.优缺点 内容: 1.定义 1.1 生成模型: 在概率统计理论中, 生成模型是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下.它给观测值和标 ...