zoukankan      html  css  js  c++  java
  • C# 编写WCF简单的服务端与客户端

    http://www.wxzzz.com/1860.html

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

    今天带如何一步一步实现WCF服务端与客户端的开发及基础讲解。

    一、在Visual Studio中创建WCF项目

    首先打开Visual Studio(我这里使用的是VS2013),然后创建一个空的解决方案命名为WCFDemo

    然后创建下面列出的4个项目并进行关系引用。

    • Contracts:它是一个类库项目,用于定义契约,在项目的引用中添加System.ServiceMode程序集;
    • Services:它是一个类库项目,用于实现契约,所以需要引用我们的Contracts项目;
    • Hosting:一个控制台应用,实现启动WCF服务,该项目须要同时引用我们的Contracts项目和Services项目,并且引用System.ServiceMode程序集;
    • Client:一个控制台应用,也需要引用System.ServiceMode程序集;

    创建好后,如图所示:

    VS_WCF

    二、创建服务契约

    首先我们需要在Contracts项目中创建契约(也就是interface接口),这里我的契约指定需要实现2个功能,分别是GetServerTime获取服务器当前时间,GetServerName获取服务器名称。

    编写代码的时候需要注意,需要给interface加上ServiceContract标记属性(指示接口或类在WCF应用程序中定义服务协定),每个契约的方法需要加上OperationContract标记属性(指示方法定义一个操作,该操作是WCF应用程序中服务协定的一部分)。最终,如下代码所示:

    [ServiceContract]
    public interface IGetServerInfo
    {
        [OperationContract]
        string GetServerTime();
    
        [OperationContract]
        string GetServerName();
    }

    三、实现服务契约

    刚刚我们已经在Contracts项目中创建好了一个IGetServerInfo的契约,现在我们需要到Services项目中创建一个GetServerInfoService类实现,该类继承IGetServerInfo进行实现即可,我编写了如下代码进行演示,分别实现了获取服务器当前时间、获取服务器的名称(我这里为了演示直接返回"Server Name:wxzzz"字符串给客户端)。

    public class GetServerInfoService:IGetServerInfo
    {
        public string GetServerTime()
        {
            return DateTime.Now.ToString();
        }
    
        public string GetServerName()
        {
            return "Server Name:wxzzz";
        }
    }

    四、启动WCF服务

    WCF服务可以自己创建程序监听服务,也可以寄宿于IIS提供服务。咱们这里先使用自己的程序进行WCF服务监听。

    WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成。

    • 地址(Address):地址决定了服务的位置;
    • 绑定(Binding):绑定实现了通信的所有细节,包括网络传输、消息编码,以及其他为实现某种功能(比如安全、可靠传输、事务等)对消息进行的相应处理。WCF中具有一系列的系统定义绑定,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等;
    • 契约(Contract):契约是对服务操作的抽象,也是对消息交换模式以及消息结构的定义。

    基于这些技术基础知识,下面是我在项目Hosting中编写的WCF服务代码块。

     static void Main(string[] args)
     {
         using (ServiceHost host = new ServiceHost(typeof(GetServerInfoService)))
         {
             host.AddServiceEndpoint(typeof(IGetServerInfo), new WSHttpBinding(), "http://127.0.0.1:9999/getserverinfoservice");
             if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
             {
                 ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                 behavior.HttpGetEnabled = true;
                 behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/getserverinfoservice/metadata");
                 host.Description.Behaviors.Add(behavior);
             }
             host.Opened += delegate
             {
                 Console.WriteLine("GetServerInfoService已经启动,按任意键终止服务!");
             };
    
             host.Open();
             Console.Read();
         }
     }

    在上面提供的服务寄宿代码中,我们为创建的ServiceHost添加了ServiceMetadataBehavior,并采用了基于HTTP-GET的元数据获取方式,元数据的发布地址通过ServiceMetadataBehaviorHttpGetUrl指定。在调用ServiceHostOpen方法对服务成功寄宿后,我们可以通过该地址获取服务相关的元数据。在浏览器的地址栏上键入http://127.0.0.1:9999/getserverinfoservice/metadata,你将会得到以WSDL形式体现的服务元数据,如下图所示。

    WCF_Metadata

    权限问题:

    如果无法启动该WCF服务,并提示错误:其他信息: HTTP 无法注册 URL http://+:9999/getserverinfoservice/。进程不具有此命名空间的访问权限(有关详细信息,请参见 http://go.microsoft.com/fwlink/?LinkId=70353)

    遇到这种问题时,将Visual Studio关闭,然后用管理员方式启动Visual Studio打开项目即可。

    五、客户端调用WCF服务

    我们编写的WCF服务成功运行后,这时我们就可以使用客户端来访问服务端了(前提是服务端一定是在运行状态)。那么在客户端如何调用我们编写的WCF服务呢,其实很简单,我们一步一步来操作。

    1.在Client项目中引用单击鼠标右键,选择添加服务引用,如图所示:

    WCF_Client

    然后弹出界面,我们在地址栏填写http://127.0.0.1:9999/getserverinfoservice/metadata然后单击“转到”按钮,即可看见我们的服务,如图所示:

    WCF_Client_WebService

    然后单击确定即可,此时服务就已经引用成功了。此时我们需要编写客户端代码运行试试看,能否得到我们的期望的结果,Client项目中控制台代码如下所示:

     static void Main(string[] args)
     {
         ServiceReference1.GetServerInfoClient client = new ServiceReference1.GetServerInfoClient();
         string sTime = client.GetServerTime();
         Console.WriteLine("服务器时间:" + sTime);
    
         string sName = client.GetServerName();
         Console.WriteLine("服务器名称:" + sName);
    
         Console.Read();
     }

    编写完成后,运行(WCF服务端一定要开启)试试看,运行效果如下所示:

    WCF_Client_Run

    嗯,这样我们基本上就完成了WCF服务端与客户端的简单示例。

    实际上在WCF中还有非常非常多的功能、扩展、细节配置等,将在后面的文章中继续陈述。

    本文示例源码下载:WCFDemo

  • 相关阅读:
    Access restriction: The type BASE64Encoder is not accessible due to restrict(转载)
    ECLIPSE控制台信息导出
    ZUI分页器的使用案例(ECLIPSE SMS项目)
    关于PLSQL启动用时较长的问题解决
    javax.naming.NamingException: Cannot create resource instance报错修改
    百度AI人脸识别的学习总结
    ECharts3.0饼状图使用问题总结
    jni开发
    AndroidStudio封装jar并混淆
    Androidstudio代码混淆
  • 原文地址:https://www.cnblogs.com/qq260250932/p/5322276.html
Copyright © 2011-2022 走看看