簡體   English   中英

具有返回值的WCF服務器到客戶端回調方法

[英]WCF Server-to-Client callback method with return value

我嘗試了不同的問題,檢查我的個人資料中的其他兩個問題,解釋了我對這種情況采取的方法遇到的困難。 我會在這里跳過它們。

我只需要一個服務器回調客戶端(通過nettcp通道)的示例(C#首選),客戶端計算答案,然后返回結果。

  • 服務器的調用線程被阻塞,直到客戶端發送響應。
  • 服務器的回調由某些事件提示,例如計時器,而不是客戶端的調用。
  • 客戶端不需要在服務器回調的上下文中回調服務器,因此不存在死鎖挑戰。
  • 客戶可以采取(並且在本練習中應該采用)用於執行計算的一個或多個參數
  • 客戶可以返回(並且為此練習,應該返回)非空的結果
  • 如果不實現,所使用的方法至少應該兼容,能夠依次處理多個客戶端,包括subscribe()和unsubscribe()功能。
  • 這不是功課,它是作為如何構建基於WCF的訂戶/發布者服務器的示例,該服務器支持(少數)具有低延遲服務器 - 客戶端通信的可信客戶端,而無需輪詢和不丟棄消息(通過圍欄)
  • 我特別對涉及(IsOneWay = true)解決方案不感興趣,除非我很清楚我對它的含義及其后果非常困惑。

謝謝!

在CodeProject上查看這篇文章 這描述了回調的基本示例。 你可能不得不改變幾件事:

  • 在回調合同上,操作標記為一種方式 - 這是為了避免由於客戶端不良而阻塞服務器(建議的做法)。 但是如果你必須阻止服務器,那么你需要刪除一種方法。 請注意,如果您要逐個回調多個客戶端,那么您可能必須在不同的線程上回調每個客戶端,否則第一個客戶端將阻止回調到下一個客戶端。

  • 何時調用回調實際上是一個服務器實現。 每當客戶端加入(或訂閱您的需求)時,給定的示例都會維護一個客戶端回調通道列表。 現在,此列表可用於以您想要的任何方式調用回調。 因此,您可以通過簡單地遍歷列表來調用計時器上的回調。 請注意,您必須確保對列表的線程安全訪問。

  • 如果客戶端必須在回調中返回一些結果,則不能再使用OneWay。

  • 如前所述,訂閱僅意味着添加到列表(示例中為加入方),取消訂閱意味着從列表中刪除(離開方)。

編輯

我從看到的示例中獲取了源代碼,並將其修改如下:

在回調契約中添加了一個方法Echo

public interface IBeerInventoryCallback
{
   ...

    [OperationContract]
    string Echo(string message);
}

當某人離開聚會並在控制台上打印來自客戶端的響應時,從服務中調用Echo。 它沒有任何問題。

請注意,此示例使用VS生成的客戶端代理,該代理繼承自System.ServiceModel.DuplexClientBase<T> ,這使客戶端代碼更加簡單。 也許,你應該嘗試一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM