• WCF系列之.net(3.0/3.5)使用示例


    WCF目前使用越来越多了,但根据不同的.NET版本,会不同的使用方式。

    首先,我们在.NET(3.0/3.5)开发WCF的使用示例。

    服务接口-》服务-》客户端。 也就是最常用的开发方式,也是最多的开发方式。

    1.服务接口:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    namespace WCF.IServiceAPI
    {
        /// <summary>
        /// 服务接口
        /// </summary>
        [ServiceContract(Namespace= "http://yuhao.com")]
        public interface IProduct
        {
            [OperationContract]
            IEnumerable<Product> GetAll();
    
            [OperationContract]
            Product Get(string id);
    
            [OperationContract]
            void Add(Product product);
    
            [OperationContract]
            void Delete(string id);
    
            [OperationContract]
            void Update(Product product);
        }
    }

    数据成员:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization;
    namespace WCF.IServiceAPI
    {
    
        /// <summary>
        /// 实体类 yuhao 2013-2-22 Create
        /// </summary>
        [DataContract(Namespace = "http://yuhao.com")]
        public class Product
        {
            [DataMember]
            public string Id { get; set; }
            [DataMember]
            public string ProductName { get; set; }
            [DataMember]
            public string Price{get;set;}
        }
    }


    2.服务端-Config配置:

      <!--手工写WCF配置说明 开始-->
      <system.serviceModel>
        <services>
          <!--Name 指的是你提供服务的类名 带命名空间  behaviorConfiguration 要暴露的元数据 一般是指要提供的行为 和下面的behaviors-->
          <service name="Wcf.Server.ProductService" behaviorConfiguration="ProductSevice">
            <host><!--Host 是配置的主机-->
              <baseAddresses>
                <add baseAddress="http://127.0.0.1:1808/ProcutService"/> <!--这里是提供的服务地址-->
              </baseAddresses>
            </host>
            <endpoint address="" binding="wsHttpBinding" contract="WCF.IServiceAPI.IProduct"><!--endpoint 总结点 表示的是服务的绑定的契约和服务协议--><!--adress为空 表示使用上面的基地址-->
            </endpoint>
    
            <!--元数据交换的endpoint-->
            <!--注:address是mex,它会和host/baseAddresses节点中的baseAddress做拼接,即提供元数据交换的地址为:http://127.0.0.1:1808/ProcutService/mex-->
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="ProductSevice"><!--这里就是Service中绑定-->
              <serviceMetadata httpGetEnabled="true"/><!--暴露元数据-->
              <serviceDebug includeExceptionDetailInFaults="true"/><!--是否对错误的元数据进行Debug-->
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
       <!--结束-->

    服务端-实现服务类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using WCF.IServiceAPI;
    namespace Wcf.Server
    {
        public class ProductService:IProduct
        {
            private static IList<Product> Products = new List<Product>()
            {
                new Product{Id="1",ProductName="Iphone4s", Price="3700"},
                new Product{Id="2",ProductName="IPad3",Price="3200"}
            };
    
            #region IProduct 成员
    
            public IEnumerable<Product> GetAll()
            {
                return Products;
            }
    
            public Product Get(string id)
            {
                Product product = Products.FirstOrDefault(e => e.Id == id);
                if (null != product)
                {
                    return product;
                }
                return null;
            }
    
            public void Add(Product product)
            {
                Products.Add(product);
            }
    
            public void Delete(string id)
            {
                Product product = this.Get(id);
                if (null != product)
                {
                    Products.Remove(product);
                }
            }
    
            public void Update(Product product)
            {
                this.Delete(product.Id);
                Products.Add(product);
            }
    
            #endregion
        }
    }

    服务端-服务开启类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    namespace Server
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (ServiceHost host = new ServiceHost(typeof(Wcf.Server.ProductService)))
                {
                    host.Open();
                    Console.WriteLine("服务已经开启");
                    Console.ReadKey();
                }
            }
        }
    }

    3.客户端调用:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using ProductService;
    public partial class _Default : System.Web.UI.Page
    {
       
        protected void Page_Load(object sender, EventArgs e)
        {
    
           ProductClient client = new ProductClient();
    
           Array.ForEach(client.GetAll().ToArray(), s => Response.Write(s.ProductName));
    
        }
    }

    至于客户端Config是调用服务类的时候,自动生成的无需手工配置

    注意,在编译服务端的时候,请使用管理员身份运行VS。

    WCF三个最最重要的就是ABC:

               第一: "A" 是地址,就是告诉别人我WCF在何处。

               第二: "B"是绑定,就是告诉别人应该走什么路才能过来。

               第三: "C"是契约:就是告诉别人我WCF这里有哪些东西。

    常用的协议三种绑定:

              第一:wsHttpBinding,   这个binding可以认为是webservice的加强版WSE,设计的目的就是用于异构系统的交互(比如java)。

              第二:netTcpBinding,   这个binding可以认为是remoting的加强版,设计的目的就是用于不同机器的.net 程序交互,

              第三: netMsmqBinding,  这个binding可以认为是msmq的加强版本,设计目的就是脱机环境下不同机器的.net程序交互,确保信息不丢失。 

    好了,文笔不好,大家谅解下,下一篇,我将讲解下载.NET(3.0/3.5)是使用WCF开发REST。

    下载示例代码:WcfDemo(.net3.5).zip

  • 相关阅读:
    srvany.exe和instsrv.exe_2
    srvany.exe和instsrv.exe
    C# “国密加密算法”SM系列的C#实现方法
    DMZ讲解
    java 判断字符串是否为json格式
    MFC DrawText如何使多行文字居中显示 Demo
    C++ 实现一个日志类
    数据库两个神器【索引和锁】
    CentOS 7.*编译安装PHP8
    Centos添加永久环境变量
  • 原文地址:https://www.cnblogs.com/flyfish2012/p/2923378.html
Copyright © 2020-2023  润新知