代码改变世界

wcf微软列子

2012-05-13 10:48  RuMing  阅读(171)  评论(0)    收藏  举报

Service

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//添加的引用
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Microsoft.ServiceModel.Samples
   
{
    
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]

    /*定义一个名为 ICalculator 的新接口,并向该接口应用 Namespace 值为
     * “http://Microsoft.ServiceModel.Samples”的 ServiceContractAttribute 特性。*/


    //定义接口
    public interface ICalculator
    {
        // Step7: Create the method declaration for the contract.
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }

    // Step 1: Create service class that implements the service contract.

    //创建一个CalculatorService 的新类。CalculatorService 实现 ICalculator 接口。
    public class CalculatorService : ICalculator
    {
        // 在 CalculatorService 类中实现在 ICalculator 接口中定义的每个方法。
        public double Add(double n1, double n2)
        {
            double result = n1 + n2;
            Console.WriteLine("Received Add({0},{1})", n1, n2);
            // Code added to write output to the console window.
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Subtract(double n1, double n2)
        {
            double result = n1 - n2;
            Console.WriteLine("Received Subtract({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Multiply(double n1, double n2)
        {
            double result = n1 * n2;
            Console.WriteLine("Received Multiply({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Divide(double n1, double n2)
        {
            double result = n1 / n2;
            Console.WriteLine("Received Divide({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 为服务的基址创建 Uri 实例。此 URI 指定 HTTP 方案、本地计算机、端口号 8000,以及服务协定中为服务命名空间指定的服务路径 ServiceModelSample/Service。
            Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service");


            // 创建一个新的 ServiceHost 实例以承载服务。必须指定实现服务协定和基址的类型。对于此示例,基址为 http://localhost:8000/ServiceModelSamples/Service,CalculatorService 为实现服务协定的类型。
            ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);

            //ServiceHost 为一个类 ,每个servicehost类的实例只能托管一个服务

            try
            {

                //提供终结点
               
                selfHost.AddServiceEndpoint(
                    typeof(ICalculator),
                    new WSHttpBinding(),
                    "CalculatorService");
                //将 ICalculator 指定为协定,将 WSHttpBinding 指定为绑定,并将 CalculatorService 指定为地址。


                // 启动元数据交换
                //WCF中元数据的发布通过一个特殊的服务行为ServiceMetadataBehavior实现
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                selfHost.Description.Behaviors.Add(smb);


                // 打开 ServiceHost 并等待传入消息。用户按 Enter 键时,关闭 ServiceHost。
                selfHost.Open();
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                selfHost.Close();
            }

            catch (CommunicationException ce)
            {
                Console.WriteLine("An exception occurred: {0}", ce.Message);

                //出现异常后调用 selfHost.Abort()。
                selfHost.Abort();
            }
        }
    }
}

  

 

Client

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.ServiceModel;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            //为要调用的服务的基址创建 EndpointAddress 实例,然后创建 WCF Client 对象
            CalculatorClient client = new CalculatorClient();


            // 从 Client 内调用客户端操作。
            // Call the Add service operation.
            double value1 = 100.00D;
            double value2 = 15.99D;
            double result = client.Add(value1, value2);
            Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

            // Call the Subtract service operation.
            value1 = 145.00D;
            value2 = 76.54D;
            result = client.Subtract(value1, value2);
            Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

            // Call the Multiply service operation.
            value1 = 9.00D;
            value2 = 81.25D;
            result = client.Multiply(value1, value2);
            Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

            // Call the Divide service operation.
            value1 = 22.00D;
            value2 = 7.00D;
            result = client.Divide(value1, value2);
            Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);

            //Step 3: Closing the client gracefully closes the connection and cleans up resources.
            client.Close();
            

            Console.WriteLine();
            Console.WriteLine("Press <ENTER> to terminate client.");
            Console.ReadLine();

     
        }
    }
}