簡體   English   中英

我可以使用WCF雙工綁定來中繼消息嗎?

[英]Can I use WCF duplex binding to relay message?

我有一個客戶端應用程序,一個服務器和另一個客戶端,可以稱之為第三方。 我的合同中有一個回調接口,該接口由第三方和客戶端共同實施。

第三方將調用服務器操作(方法),然后服務器將觸發回調,但不是調用第三方的回調,而是調用客戶端的回調實現。

是的,您絕對可以做到。

最簡單的方法是將服務實現為PerSession服務,並在初始化/構造時捕獲回調上下文。 通常,我會將服務對象(實際上表示該時刻的連接)添加到內部核心對象。

然后,當您收到來自客戶端的消息時,您可以調用任何服務對象(而不是通過合同),並在內部將數據轉發到關聯的客戶端。

這是該概念的極小的實現,沒有異常處理,並且有一些非常糟糕的設計(靜態類BAD!)。 我還沒有對此進行測試,但是即使我錯過了穿越i或打t的原則,這些原則也應該成立。 此示例還將呼叫轉發給所有客戶端,但是選擇單個客戶端遵循相同的基本模式。

嘗試使用單例服務來做到這一點將更加困難,並且按呼叫的服務顯然不起作用:)

[ServiceContract(CallbackContract = typeof(ICallback))]
public interface IContract
{
    [OperationContract(IsOneWay = true)]
    void SendTheData(string s);
}

public interface ICallback
{
    [OperationContract(IsOneWay = true)]
    void ForwardTheData(string s);
}

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.PerSession)]
public class ServiceConnection : IContract
{
    private ICallback m_callback;

    public ServiceConnection()
    {
        m_callback = OperationContext.Current.GetCallbackChannel<ICallback>();
        ServiceCore.Add(this);
    }

    public void SendTheData(string s)
    {
        ServiceCore.DataArrived(s);
    }

    public void SendToClient(string s)
    {
        m_callback.ForwardTheData(s);
    }
}

static public class ServiceCore
{
    static private List<ServiceConnection> m_connections = new List<ServiceConnection>();


    public static void DataArrived(string s)
    {
        foreach(ServiceConnection conn in m_connections)
        {
            conn.SendTheData(s);
        }
    }

    public static void Add(ServiceConnection connection)
    {
        m_connections.Add(connection);
    }
}

從Microsoft Duplex服務文檔的快速閱讀中,我認為這不會滿足您的要求。 可能還有其他一些聰明的功夫WCF方式,但是在我的情況下,我為服務器創建了一個“ PassThruService”,該服務器實現了與真實服務相同的合同,並將收到的所有請求發送到客戶端。

這是我的代碼的一部分,解釋了它的目的。

private const int OPERATION_TIMEOUT = 5000;
private MyServiceClient m_client = new MyServiceClient();

public bool IsAlive() {
    try {
        logger.Debug("PassThruService IsAlive.");

        bool isAlive = false;
        ManualResetEvent isAliveMRE = new ManualResetEvent(false);

        m_client.IsAliveComplete += (s, a) => { isAlive = a.Result; isAliveMRE.Set(); };
        m_client.IsAliveAsync();

        if (isAliveMRE.WaitOne(OPERATION_TIMEOUT)) {
            return isAlive;
        }
        else {
            throw new TimeoutException();
        }
    }
    catch (Exception excp) {
        logger.Error("Exception PassThruService IsAlive. " + excp.Message);
        throw;
    }

我沒有完全看到您在這里真正要問的問題。...但是無論如何我都會嘗試給出一些提示。

在.NET 3.5中的WCF中,中繼消息或路由不是很受支持-那里有基礎結構,但是手動設置它仍然需要大量工作。

關於.NET 3.5中WCF的這個主題,我所知道的最好的介紹是MSDN雜志上的Michele Leroux Bustamante的兩部分文章:

第2部分有一個關於雙工路由器的部分-完全可以幫助您完成任務嗎?

.NET 4.0中的WCF承諾將提供對路由的附加支持-將有一個RoutingService基類,可以利用該基類來編寫路由服務,並且它將允許可配置的,基於內容或基於元數據的路由-無論您需要什么。

.NET 4.0計划於今年晚些時候(2009年)發布-希望! 因此,盡管這仍然是未來,但它看起來還是美好的!

我想我找到了解決方案。

這是鏈接。 http://msdn.microsoft.com/en-us/magazine/cc163537.aspx

嘗試看一下圖6。這就是我要實現的目標。

暫無
暫無

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

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