2014-07-24 104 views
1

我是wcf的新手,並學習如何使用回調來構建一個wcf。我從以下鏈接的示例:測試客戶端不支持WCF服務合同

http://architects.dzone.com/articles/logging-messages-windows-0

我試圖實現WCF但是當我運行這在作爲測試按F5鍵,測試客戶說:

wcf客戶端不支持服務合同。

服務:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.PerCall)] 
public class RatsService : IRatsService 
{ 
    public static List<IRatsServiceCallback> callBackList = new List<IRatsServiceCallback>(); 

    public RatsService() 
    { 
    } 

    public void Login() 
    { 
     IRatsServiceCallback callback = OperationContext.Current.GetCallbackChannel<IRatsServiceCallback>(); 
     if (!callBackList.Contains(callback)) 
     { 
      callBackList.Add(callback); 
     } 
    } 


    public void Logout() 
    { 
     IRatsServiceCallback callback = OperationContext.Current.GetCallbackChannel<IRatsServiceCallback>(); 
     if (callBackList.Contains(callback)) 
     { 
      callBackList.Remove(callback); 
     } 

     callback.NotifyClient("You are Logged out"); 
    } 

    public void LogMessages(string Message) 
    { 
     foreach (IRatsServiceCallback callback in callBackList) 
      callback.NotifyClient(Message); 

    } 

服務接口

[ServiceContract(Name = "IRatsService", SessionMode = SessionMode.Allowed, CallbackContract = typeof(IRatsServiceCallback))] 
public interface IRatsService 
{ 
    [OperationContract] 
    void Login(); 

    [OperationContract] 
    void Logout(); 


    [OperationContract] 
    void LogMessages(string message); 


    // TODO: Add your service operations here 
} 

public interface IRatsServiceCallback 
{ 
    [OperationContract] 
    void NotifyClient(String Message); 
} 

App.config中:

<system.serviceModel> 
<services> 
    <service name="RatsWcf.RatsService"> 
    <endpoint address="" binding="wsDualHttpBinding" contract="RatsWcf.IRatsService"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8733/Design_Time_Addresses/RatsWcf/Service1/" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <!-- To avoid disclosing metadata information, 
     set the values below to false before deployment --> 
     <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/> 
     <!-- To receive exception details in faults for debugging purposes, 
     set the value below to true. Set to false before deployment 
     to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="False" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

只是想知道這裏可能是錯的。

回答

3

沒有什麼錯。 WCF測試客戶端是一種可用於測試許多類型的WCF服務的工具,但並非全部 - 雙工合同是不支持的一類。你需要創建一些客戶端應用程序來測試。在您的客戶端應用程序中,您需要編寫一個實現回調接口的類,以便它可以接收由服務發起的消息。

例如,這是一個非常簡單的雙工客戶端/服務它使用WCF雙工:

public class DuplexTemplate 
{ 
    [ServiceContract(CallbackContract = typeof(ICallback))] 
    public interface ITest 
    { 
     [OperationContract] 
     string Hello(string text); 
    } 
    [ServiceContract(Name = "IReallyWantCallback")] 
    public interface ICallback 
    { 
     [OperationContract(IsOneWay = true)] 
     void OnHello(string text); 
    } 
    public class Service : ITest 
    { 
     public string Hello(string text) 
     { 
      ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>(); 
      ThreadPool.QueueUserWorkItem(delegate 
      { 
       callback.OnHello(text); 
      }); 

      return text; 
     } 
    } 
    class MyCallback : ICallback 
    { 
     AutoResetEvent evt; 
     public MyCallback(AutoResetEvent evt) 
     { 
      this.evt = evt; 
     } 

     public void OnHello(string text) 
     { 
      Console.WriteLine("[callback] OnHello({0})", text); 
      evt.Set(); 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "net.tcp://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.AddServiceEndpoint(typeof(ITest), new NetTcpBinding(SecurityMode.None), ""); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     AutoResetEvent evt = new AutoResetEvent(false); 
     MyCallback callback = new MyCallback(evt); 
     DuplexChannelFactory<ITest> factory = new DuplexChannelFactory<ITest>(
      new InstanceContext(callback), 
      new NetTcpBinding(SecurityMode.None), 
      new EndpointAddress(baseAddress)); 
     ITest proxy = factory.CreateChannel(); 

     Console.WriteLine(proxy.Hello("foo bar")); 
     evt.WaitOne(); 

     ((IClientChannel)proxy).Close(); 
     factory.Close(); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
相關問題