跟我一起从零开始学WCF系列课程

http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/Series/WCF_Begin.aspx

服务和协定

服务协定使用接口,可以建模

定义服务协定:在类或接口上使用 ServiceContractAttribute属性标记

在方法上使用 OperationContractAttribute 

服务操作不会传递对对象的引用,他们传递的只是对象的副本。

所以要求参数或返回值中使用的类型都是可序列化的。

基元类型都是可序列化的。 

消息模式:

请求/答复:默认模式 

单向消息模式:客户端不必等待操作完成

将IsOneWay 属性设置为true即可,默认是false

[OperationContract(IsOneWay=true)] 

双工模式:服务和客户端均能够独立地向对方发送消息。

若要设计双工协定,还必须设计回调协定,并将该回调协定的类型分配给

ServiceContractAttribute 的 CallBackContract 属性。 

数据协定: DataContract  DataMember

双工模式例子:

建一个wcflibrary

namespace WcfServiceLibrary
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
    [ServiceContract(Namespace="http://Moicrosoft.ServiceModel.Samples",SessionMode = SessionMode.Required
      , CallbackContract = typeof(ICalculatorDuplexCallback))]
    public interface IService1
    {
        [OperationContract(IsOneWay = true)]
        void Clear();
        [OperationContract(IsOneWay = true)]
        void AddTo(double n);
        [OperationContract(IsOneWay = true)]
        void SubtractFrom(double n);
        [OperationContract(IsOneWay = true)]
        void MultiplyBy(double n);
        [OperationContract(IsOneWay = true)]
        void DivideBy(double n);
        // TODO: 在此添加您的服务操作
    }

    public interface ICalculatorDuplexCallback
    {
        [OperationContract(IsOneWay = true)]
        void Equals(double result);
        [OperationContract(IsOneWay = true)]
        void Equation(string eqn);
    }
}
  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class Service1 : IService1
    {
        double result;
        string equation;
        ICalculatorDuplexCallback callback = null;
        public Service1()
        {
            result = 0.0D;
            equation = result.ToString();
            callback = OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
        }

        public void Clear()
        {
            callback.Equation(equation + "=" + result.ToString());
            result = 0.0D;
            equation = result.ToString();
        }
        public void AddTo(double n)
        {
            result += n;
            equation += "+" + n.ToString();
            callback.Equals(result);
        }
        public void SubtractFrom(double n)
        {
            result -= n;
            equation += "-" + n.ToString();
            callback.Equals(result);
        }
        public void MultiplyBy(double n)
        {
            result *= n;
            equation += "*" + n.ToString();
            callback.Equals(result);
        }
        public void DivideBy(double n)
        {
            result /= n;
            equation += "/" + n.ToString();
            callback.Equals(result);
        }
    }

配置文件中修改两个地方:

   <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary/Service1/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
        <endpoint address="" binding="wsDualHttpBinding" contract="WcfServiceLibrary.IService1">

在控制台应用程序中进行调试:

先引用WCF的WEB服务

namespace ConsoleApplication1
{
    public class CallbackHandler : IService1Callback
    {
        public void Equals(double result)
        {
            Console.WriteLine("result{0}",result);
        }
        public void Equation(string result)
        {
            Console.WriteLine("Equation{0}", result);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            InstanceContext instanceContext = new InstanceContext(new CallbackHandler());
            ServiceReference1.Service1Client client = new ServiceReference1.Service1Client(instanceContext);
            Console.WriteLine("Enter .");
            double value = 100.00D;
            client.AddTo(value);

            value = 50.00D;
            client.SubtractFrom(value);

            value = 17.65D;
            client.MultiplyBy(value);

            value = 2.00D;
            client.DivideBy(value);
            client.Clear();
            Console.ReadLine();
            client.Close();
        }
    }
}

跟我一起从零开始学WCF系列课程