2011-04-21 33 views
35

我想知道WCF中是否有事件處理的方式。 我遇到過WCF中的回調,但我想在WCF中進行事件處理。WCF服務如何將事件提交給客戶?

我的要求是像我想用事件在WCF處理,以提高事件對特定客戶不要所有的客戶,我也想保持會話。

我已經看到了WCF與回調涉及發佈/訂閱模式,但這種模式發佈到誰已訂閱,但我想只發布到選定的客戶端的所有客戶端。

我認爲可以使用WCF活動來完成。

客戶端:

public class Callbacks : IServiceCallback 
{ 
    public void CallToMyClient(string name) 
    { 
     this.CallToMyClient(name); 

    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Callbacks callback = new Callbacks();    
    ServiceClient client = new ServiceClient(new InstanceContext(callback));   

    client.SubscribeClient(); 
    client.DoSomeWork(); 
} 

回答

5

不能使用的事件。您可以使用回調模擬事件。

+0

我如何能達到我的要求,如我在文章中提到的。 – user662285 2011-04-21 04:45:01

+6

@ John:任何鏈接或代碼。 – user662285 2011-04-21 04:47:38

+10

其實,它是,而你是特別無益的。其他答案爲他們的答案提供了代碼和具體說明,同時您提供的只是居高臨下的評論。 – Daniel 2016-06-09 09:32:55

60

有一個在WCF沒有事件通知它的客戶端,但有回調通道,儘管其工作原理是在兩種情況下完全不同的回調通道的目的是一樣的事件。 要通知特定的客戶端,你可以做的是訂閱某個地方時該客戶端的存儲回調通道(在這種情況下,我更喜歡Dictionary)。稍後,您可以選擇該實例並通過該通道調用您的回調方法,這樣做只有一個客戶端會收到通知。

UPDATE

如果你有興趣在這裏是代碼:

public interface IClientCallback 
{ 
    //Your callback method 
    [OperationContract(IsOneWay = true)] 
    void CallToMyClient(string name); 
} 
[ServiceContract(CallbackContract = typeof(IClientCallback))] 
public interface ITestService 
{ 

    [OperationContract(IsOneWay = true)] 
    void SubscribeClient(); 
    [OperationContract(IsOneWay = true)] 
    void DoSomeWork(); 
} 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Reentrant)] 
public class ServiceImplementation : ITestService 
{ 
    private static readonly List<IClientCallback> CallbackChannels = new List<IClientCallback>(); 

    /// <summary> 
    /// client should call this method before being notified to some event 
    /// </summary> 
    public void SubscribeClient() 
    { 
     var channel = OperationContext.Current.GetCallbackChannel<IClientCallback>(); 
     if (!CallbackChannels.Contains(channel)) //if CallbackChannels not contain current one. 
     { 
      CallbackChannels.Add(channel); 
     } 
    } 

    public void DoSomeWork() 
    { 
     //Here write your code to do some actual work 
     //After you done with your work notify client 
     //here you are calling only the first client that is registered 
     IClientCallback callbackChannel = CallbackChannels[0]; 
     callbackChannel.CallToMyClient("You are the only one receving this message"); 
    } 
} 
+0

感謝您的服務代碼。客戶端代碼我ahve張貼上面請看看 – user662285 2011-04-21 05:32:21

+0

,但我不能提高事件。 – user662285 2011-04-21 05:46:01

+6

你可以請求我的客戶端代碼 – user662285 2011-04-21 06:33:56

1

如果您正在使用WCF的RPC(如並列到Web服務或休息),可以使用.Net Remoting來perfrom事件調用跨進程。

+3

-1:.NET Remoting已被棄用,並被WCF取代。 – 2013-02-20 20:28:27

+3

John .net遠程處理不被棄用。它的遺留問題仍然具有寶貴的用例,尤其是在需要RPC事件調用的情況下!請提前下投票教育你的自我: http://stackoverflow.com/questions/1294494/is-net-remoting-really-deprecated – Dmitry 2013-02-20 20:52:38

+0

請注意關於框架MS技術領先的負責自己的話說: 「Remoting是部分的.Net框架,因此它不會消失...對於進程內,跨應用程序域通信Remoting是CLR的本地溝通方式。 – Dmitry 2013-02-20 20:54:31

4

WCF Duple Operation and UI Threads By jeff.barnes

也許這可以幫助你。

的WCF不支持事件處理程序。回撥渠道是它的方式

+0

這是一個很容易構建和運行的有趣示例(只要您記得以管理員身份運行BeerService)。我使用升級嚮導將其加載到VS 2010中(沒有任何問題)。 – 2013-06-29 02:52:51