C# WCF回调服务订阅\取消订阅
我试图了解如何使用WCF的回调。我正在创建下一个接口:C# WCF回调服务订阅\取消订阅,c#,wcf,notsupportedexception,C#,Wcf,Notsupportedexception,我试图了解如何使用WCF的回调。我正在创建下一个接口: public interface INotifierCallback : IEquatable<INotifierCallback> { /// <summary> /// Send notification. /// </summary> /// <param name="notification">Notification.</param>
public interface INotifierCallback : IEquatable<INotifierCallback>
{
/// <summary>
/// Send notification.
/// </summary>
/// <param name="notification">Notification.</param>
[OperationContract(IsOneWay = true)]
void SendNotificationBack(string notification);
}
[ServiceContract(Namespace = "http://MyWCFLearning.com/NorthwindCallbackService",
CallbackContract = typeof(INotifierCallback))]
public interface INorthwindCallbackService
{
/// <summary>
/// Subscribe to notifications.
/// </summary>
[OperationContract]
void Subscribe();
/// <summary>
/// Unsubscribe from notifications.
/// </summary>
[OperationContract]
void Unsubscribe();
/// <summary>
/// Send notification.
/// </summary>
/// <param name="notification">Notification.</param>
[OperationContract(IsOneWay = true)]
void SendNotification(string notification);
}
在执行下一行WCF服务时,我不支持Equals方法的例外:
if (NorthwindCallbackService.mCallbacks.ContainsKey(callbackForClient))
我知道这个问题的原因是无法实现,但如何在服务器端实现它,以及使用回调的最佳方式是什么?这个答案是关于问题的最后一部分: 使用回调的最佳方式是什么 您已经了解了这个想法,但是为什么不使用
ConcurrentDictionary
的字节值呢?首先,没有“最佳方式”。但我建议更改ConcurrentDictionary
,这样您就可以将客户端id和回调信息一起存储到ConcurrentDictionary
中,这样您就可以更轻松地查询并存储有关客户端的更多信息:
public class NorthwindCallbackService : INorthwindCallbackService
{
/// <summary>
/// Callbacks to clients.
/// </summary>
protected static IDictionary<Guid, INotifierCallback> mCallbacks { get; set; }
static NorthwindCallbackService()
{
NorthwindCallbackService.mCallbacks = new ConcurrentDictionary<Guid, INotifierCallback>();
}
public void Subscribe(Guid clientId)
{
INotifierCallback callbackForClient;
callbackForClient = OperationContext.Current.GetCallbackChannel<INotifierCallback>();
if (NorthwindCallbackService.mCallbacks.ContainsKey(clientId) == false)
{
NorthwindCallbackService.mCallbacks.Add(clientId, callbackForClient);
}
}
public void Unsubscribe(Guid clientId)
{
INotifierCallback callbackForClient;
callbackForClient = OperationContext.Current.GetCallbackChannel<INotifierCallback>();
if (NorthwindCallbackService.mCallbacks.ContainsKey(clientId))
{
NorthwindCallbackService.mCallbacks.Remove(clientId);
}
}
public void SendNotification(string notification)
{
foreach (var currentCallback in NorthwindCallbackService.mCallbacks)
{
try
{
currentCallback.Value.SendNotificationBack(notification);
}
catch (ObjectDisposedException)
{
//TODO: When client of NorthwindCallbackService call Dispose() method, we should remove callback of him from NorthwindCallbackService.mCallbacks, but I do not know how to make it.
}
}
}
}
if (NorthwindCallbackService.mCallbacks.ContainsKey(callbackForClient))
public class NorthwindCallbackService : INorthwindCallbackService
{
/// <summary>
/// Callbacks to clients.
/// </summary>
protected static IDictionary<Guid, INotifierCallback> mCallbacks { get; set; }
static NorthwindCallbackService()
{
NorthwindCallbackService.mCallbacks = new ConcurrentDictionary<Guid, INotifierCallback>();
}
public void Subscribe(Guid clientId)
{
INotifierCallback callbackForClient;
callbackForClient = OperationContext.Current.GetCallbackChannel<INotifierCallback>();
if (NorthwindCallbackService.mCallbacks.ContainsKey(clientId) == false)
{
NorthwindCallbackService.mCallbacks.Add(clientId, callbackForClient);
}
}
public void Unsubscribe(Guid clientId)
{
INotifierCallback callbackForClient;
callbackForClient = OperationContext.Current.GetCallbackChannel<INotifierCallback>();
if (NorthwindCallbackService.mCallbacks.ContainsKey(clientId))
{
NorthwindCallbackService.mCallbacks.Remove(clientId);
}
}
public void SendNotification(string notification)
{
foreach (var currentCallback in NorthwindCallbackService.mCallbacks)
{
try
{
currentCallback.Value.SendNotificationBack(notification);
}
catch (ObjectDisposedException)
{
//TODO: When client of NorthwindCallbackService call Dispose() method, we should remove callback of him from NorthwindCallbackService.mCallbacks, but I do not know how to make it.
}
}
}
}
public class ClientCallbackInfo
{
public INotifierCallback Callback { get; set; }
public string SomeOtherClientInfo { get; set; }
}