码迷,mamicode.com
首页 > 其他好文 > 详细

一个新手学习WCF的第一个实例

时间:2015-08-05 12:37:54      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:

   一、概述

      WCF说白了就是一个基于终结点的通信手段!就是Service端提供一定的功能实现,然后暴露出一个或多个终结点,Client端调用Service端的功能(可以理解为调用一个函数),那么Client端是通过何种方式来匹配呢?就是通过匹配Service端暴露出的终结点,既然是匹配,那就说明终结点有一定的属性,这就是我们说的ABC:

      A=address(地址)

      B=Binding(绑定)

      C=Contract(契约)

      怎么来让大家更通俗的了解ABC呢?这里我引用园里的一位老师的的一个例子:

      有两个城市A、B,假设A市的快递需要去B市领,这里涉及到三个方面的问题:你首先必须知道B的地址(address)对吧,没地址你是根本去不了的,有了地址,那你要怎么去B市,你可以打车去,走路去等等,方式有很多种,但你必须要一交通方式前往B市,这个方式就是Binding,当你到了B市取快递的地方,难道你可以直接把快递拿走吗?显然不行,你必须和快递公司对上货物信息对方才会给你,这个用来匹配的信息就是Contract。

二、一个非常简单的WCF程序

       这里我带领大家一步一步来完成这个程序

      1、首先我们新建一个空白的解决方案MyWCF(新建项目-》其他项目类型-》Visual Studio解决方案-》空白解决方案)这里我们用的是VS2013

       技术分享

      2、 然后右键点击解决方案,添加一个控制台应用程序,命名为Service:

       技术分享

      3、右键点击控制台程序Service,添加一个WCF服务,命名为Data

      技术分享

      这里将生成Data.cs,IData.cs文件

      4、点开IData.cs文件,写一个接口(契约)文件

   

 1 using System.Collections.Generic;
 2 using System.Linq;
 3 using System.Runtime.Serialization;
 4 using System.ServiceModel;
 5 using System.Text;
 6 
 7 namespace Service
 8 {
 9     /// <summary>
10     /// 用ServiceContract来标记此接口是服务契约
11     /// </summary>
12     [ServiceContract]
13     public interface IData
14     {
15         /// <summary>
16         /// 用OperationContract来标记此方法为操作契约
17         /// </summary>
18         [OperationContract]
19         string WCFHello(string name);
20     }
21 }

 

    5、点开Data.cs文件,实现接口,即实现契约

 1 using System.Collections.Generic;
 2 using System.Linq;
 3 using System.Runtime.Serialization;
 4 using System.ServiceModel;
 5 using System.Text;
 6 
 7 namespace Service
 8 {
 9     // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Data”。
10     public class Data : IData
11     {
12         public string WCFHello(string name)
13         {
14             return string.Format("{0},Hello!", name);
15         }
16     }
17 }

     运行该程序,一定要记得运行Client端时必须保证Service运行,这时我们打开Web.config文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
    </startup>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service name="Service.Data">
                <endpoint address="" binding="basicHttpBinding" contract="Service.IData">
                    <identity>
                        <dns value="localhost" />
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8733/Design_Time_Addresses/Service/Data/" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>
</configuration>
 将下划线的这个地址复制,因为在Client端需要
6、打开Program.cs文件,在这里因为你要使用ServiceHost类,则必须引用其命名空间using System.ServiceModel(添加引用的方法:右键点击“引用”
-》添加引用-》框架-》System.ServiceModel-》确定,当ServiceHost显示错误时,把光标放在上面当显示using细节时直接添加
关于ServiceHost类的详细信息可以访问微软https://msdn.microsoft.com/zh-cn/library/system.servicemodel.servicehost.aspx
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.ServiceModel;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 
 8 namespace Service
 9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             //定义一个ServiceHost类实例,ServiceHost类提供服务的主机
15             //注意参数中要使用契约实现类而不是接口,注意!!!!
16             using (ServiceHost host=new ServiceHost (typeof (Service.Data )))
17             {
18                 host.Open();
19                 Console.WriteLine("Service Running...");
20                 Console.ReadKey();
21                 host.Close();
22             }
23         }
24     }
25 }

    运行该程序,生成.exe文件,不用关闭

 

  7、接下来就是创建Client端,新建一个控制台应用程序(不是在之前的解决方案下,而是另外建一个),命名为Client

      首先必须先添加服务引用(右键“引用”-》添加服务引用-》输入之前复制的address,并修改命名空间为HelloWCF(命名随意),如图

     技术分享

 这个时候我们可以打开App.config看看:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IData" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8733/Design_Time_Addresses/Service/Data/"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IData"
                contract="HelloWCF.IData" name="BasicHttpBinding_IData" />
        </client>
    </system.serviceModel>
</configuration>

   打开Program.cs,添加引用using System.ServiceModel和using System.ServiceModel.Channels,方法和之前的一样

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.ServiceModel;
 5 using System.ServiceModel.Channels;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8 
 9 namespace Client
10 {
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             //这里的"BasicHttpBinding_IData"正是我们之前打开的App.config里的name="BasicHttpBinding_IData"
16             //ChannelFactory的类型也是contract="HelloWCF.IData"
17             var proxy = new ChannelFactory<HelloWCF.IData>("BasicHttpBinding_IData").CreateChannel();
18             Console.WriteLine(proxy.WCFHello("Tom"));
19             ((IChannel)proxy).Close();
20         }
21     }
22 }

 

运行即可,查看运行结果:
技术分享


这样一个简单的WCF入门程序就完成了!
因为这是我的第一篇,因为我的水平有限,不足之处还望指出,谢谢!!!!


一个新手学习WCF的第一个实例

标签:

原文地址:http://www.cnblogs.com/yanneu/p/4700439.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!