2011-09-26 111 views
2

我一直在瀏覽互聯網一段時間,但找不到符合我的具體問題的任何內容。如果有人能夠簡潔地解釋這一點,我將不勝感激。WCF服務和Windows應用程序客戶端的幫助

基本上我想從我的客戶端(Windows應用程序)調用WCF Web服務,此服務將執行更新。不過,我希望服務能夠以進度方式「回調」客戶端,以便用戶通過可視化進度條查看正在發生的事情。這可以做到嗎?

我看過的具有回調在其中,並嘗試寫一些代碼,但不具有最大的運氣確實讓這些回調火,我大致瞭解wsDualHttpBinding之間的磨難全雙工WCF服務的概念和netTcpBinding,但不能真正得到任何工作。

目前我的測試運行在同一個盒子上,即Windows應用程序和WCF服務(運行關閉http://localhost:58781/)。我知道一旦這些轉向生產環境,我可能會得到更多的問題,所以我現在想要考慮這些問題。

任何幫助,這將不勝感激。

+0

肯定看一看由GertArnold – EtherDragon

回答

2

這是具有自託管服務和客戶端的準系統示例。

合同

[ServiceContract(CallbackContract = typeof(IService1Callback), SessionMode=SessionMode.Required)] 
public interface IService1 
{ 
    [OperationContract] 
    void Process(string what); 
} 

public interface IService1Callback 
{ 
    [OperationContract] 
    void Progress(string what, decimal percentDone); 
} 

服務器

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class Service1 : IService1 
{ 
    public void Process(string what) 
    { 
     Console.WriteLine("I'm processing {0}", what); 
     for (int i = 0; i < 10; i++) 
     { 
      OperationContext.Current.GetCallbackChannel<IService1Callback>().Progress(what, (i+1)*0.1M); 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 

     using (ServiceHost host = new ServiceHost(typeof(Service1), new Uri[] { new Uri("net.tcp://localhost:6789") })) 
     { 
      host.AddServiceEndpoint(typeof(IService1), new NetTcpBinding(SecurityMode.None), "Service1"); 
      host.Open(); 
      Console.ReadLine(); 
      host.Close(); 
     } 
    } 
} 

客戶

public class CallbackHandler : IService1Callback 
{ 
    public void Progress(string what, decimal percentDone) 
    { 
     Console.WriteLine("Have done {0:0%} of {1}", percentDone, what); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     // Setup the client 
     var callbacks = new CallbackHandler(); 
     var endpoint = new EndpointAddress(new Uri("net.tcp://localhost:6789/Service1")); 
     using (var factory = new DuplexChannelFactory<IService1>(callbacks, new NetTcpBinding(SecurityMode.None), endpoint)) 
     { 
      var client = factory.CreateChannel(); 
      client.Process("JOB1"); 
      Console.ReadLine(); 
      factory.Close(); 
     } 
    } 
} 

這使用一個雙工信道OV er net.tcp,通信由服務器觸發以通知客戶進程更新。

客戶端會顯示:

Have done 10% of JOB1 
Have done 20% of JOB1 
Have done 30% of JOB1 
Have done 40% of JOB1 
Have done 50% of JOB1 
Have done 60% of JOB1 
Have done 70% of JOB1 
Have done 80% of JOB1 
Have done 90% of JOB1 
Have done 100% of JOB1 
+0

添加的鏈接這是偉大的,但你將如何使用這不典型的console.writeline?而是更新進度條? – Coesy

+1

那麼在WinForms中,您可以簡單地使用窗體實現IService1Callback並更新Progress(...)的實施進度條。 –

+0

您可能想要查看:http://www.dotnetdude.com/CategoryView,category,WCF.aspx –