[WCF编程]1.WCF入门示例_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > [WCF编程]1.WCF入门示例

[WCF编程]1.WCF入门示例

 2014/8/19 16:43:02  烧点饭  程序员俱乐部  我要评论(0)
  • 摘要:一、WCF是什么?WindowsCommunicationFoundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的.netRemoting,WebService,Socket的机制,并融合有Http和Ftp的相关技术,是Windows平台上开发分布式应用最佳的实践方式。使用该框架,开发人员可以构建跨平台、安全、可靠和支持事务处理的企业级互联应用解决方案。二、WCF的优势1.统一性WCF涵盖了之前微软推出的所有用于分布式开发的技术
  • 标签:WCF 编程

一、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 = 1,
        Woman = 2,
        UnKnown = 3
    }
HelloWorldService.cs
public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string str)
        {
            return "您说了:" + str;
        }

        public Student Say()
        {
            Student stu = new Student()
            {
                UserName = "zxj",
                Age = 20,
                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 = 0;
            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 = 0;
            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

发表评论
用户名: 匿名