서비스 계약(이중 계약의 서버와 클라이언트 실현 사례)

1. 서버 측 정의
코드
     using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace Contract {     [ServiceContract(CallbackContract=typeof(IClientCallback))]     public interface IServerStock     {         [OperationContract(IsOneWay = true)]         void RegisterForUpdates(string ticker);     }     public interface IClientCallback     {         [OperationContract(IsOneWay = true)]         void PriceUpdate(string ticker, double price);     }     public class ServerStock : IServerStock     {        //This is NOT a good notification algorithm as it's creating        //one thread per client. It should be inverted so it's creating        //one thread per ticker instead.         public void RegisterForUpdates(string ticker)         {             Update bgWorker = new Update();             bgWorker.callback = OperationContext.Current.GetCallbackChannel();             Thread t = new Thread(new ThreadStart(bgWorker.SendUpdateToClient));             t.IsBackground = true;             t.Start();         }     }     public class Update     {         public IClientCallback callback = null;         public void SendUpdateToClient()         {             Random p = new Random();             for (int i = 0; i < 10; i++)             {                 Thread.Sleep(5000);//updates occurs somewhere                 try                 {                     callback.PriceUpdate("msft", 100.00 + p.NextDouble());                 }                 catch (Exception ex)                 {                     Console.WriteLine("Error sendinig cache to client:{0}", ex.Message);                 }             }         }     } }
구성 파일:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="MEXServiceTypeBehavior" name="WCFTest.ServerStock">
        <endpoint address="" binding="wsDualHttpBinding" contract="WCFTest.IServerStock" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://DL00549-990:8000" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MEXServiceTypeBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

2. 클라이언트 정의

  
  
  
  
namespace Client { public class CallbackHandler : IServerStockCallback { static InstanceContext site = new InstanceContext( new CallbackHandler()); static ServerStockClient proxy = new ServerStockClient(site); public void PriceUpdate( string ticker, double price) { Console.WriteLine( " Received alert at : {0}. {1}:{2} " ,
System.DateTime.Now, ticker, price); } class Program { static void Main( string [] args) { proxy.RegisterForUpdates( " MSFT " ); Console.WriteLine( " Press Enter or any key to exit " ); Console.ReadLine(); } } } }

좋은 웹페이지 즐겨찾기