[英]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年)發布-希望! 因此,盡管這仍然是未來,但它看起來還是美好的!
渣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.