我想知道WCF中是否有事件处理方式。 我遇到了WCF中的Callbacks,但我想在WCF中进行事件处理。
我的要求是,我想要向特定客户端发送事件,而不是使用WCF中的事件处理向所有客户端发送事件,我也希望维护会话。
我在WCF中看到过处理Callback的发布者/订阅者模型,但是这个模型发布给所有订阅但我只想发布到选定客户端的客户。
我认为可以使用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();
}
答案 0 :(得分:68)
WCF中没有事件通知它的客户端但是有一个回调通道,回调通道的目的与事件相同,尽管两种情况下的工作原理完全不同。 要通知特定客户端您可以做的是在订阅某个地方时存储该客户端的回调通道(在这种情况下我更喜欢Dictionary)。稍后您可以选择实例并通过该通道调用您的回调方法,这样做只会通知一个客户端。
<强>更新强>
如果您对此感兴趣,请输入以下代码:
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");
}
}
答案 1 :(得分:4)
答案 2 :(得分:1)
您无法使用活动。您可以使用回调来模拟事件。
答案 3 :(得分:1)
如果您使用WCF进行RPC(而不是Web服务或休息),则可以使用.Net Remoting执行事件调用跨进程。