【问题标题】:Passing data into a callback, is data guaranteed to be received?将数据传入回调,是否保证接收到数据?
【发布时间】:2010-09-22 10:25:36
【问题描述】:

我的问题是:有一段这样的代码(通过回调合约进行通信)

private void BroadcastMessage(DataEventArgs e)
{
    DataEventHandler temp = DataEvent;

    if (temp != null)
    {
        foreach (DataEventHandler handler in temp.GetInvocationList())
        {
            handler.BeginInvoke(this, e, EndAsync, null);
        }
    }
}

还有一个回调合约

interface IDataCallback
{
    [OperationContract(IsOneWay = true)]
    void EntityUpdateReceived(Entity entity);

    [OperationContract(IsOneWay = true)]
    void EntitiesUpdateReceived(List<Entity> entities);

    [OperationContract(IsOneWay = true)]
    void EntityDeleteReceived(Entity entity);

    [OperationContract(IsOneWay = true)]
    void EntitiesDeleteReceived(List<Entity> entities);

    [OperationContract(IsOneWay = true)]
    void SendLogOffMessage(string message);

    [OperationContract(IsOneWay = true)]
    void Logoff();

    [OperationContract(IsOneWay = true)]
    void UpdatePlan(int userId);
}

我是否有保证消息将成功广播给所有客户端,即使有一些,比如说网络问题?我的意思是,服务是否会自动尝试一次又一次地传递消息,直到它成功,假设客户端一直处于连接状态,但在第一次传递过程中出现了一些问题。我问是因为我不知道我是否必须编写额外的代码才能保证它 (服务客户端确认消息等)我在 app.config 中启用了可靠会话,可靠会话能解决问题吗??

提前感谢您的回答

【问题讨论】:

    标签: c# wcf callback contract begininvoke


    【解决方案1】:

    这取决于绑定和配置(更多细节see here)。即便如此,可靠性也是不耐用的。

    如果您想要可靠持久的东西,您可能需要查看事务队列,例如通过 MSMQ(尽管有许多队列技术可用)。您甚至可能希望同步发布到队列,因为您希望它可用。

    【讨论】:

    • 谢谢,这消除了我的顾虑并解决了我的问题。我已经按照您的链接中的文章中所说的方式配置了它(具有可靠会话的自定义绑定)。我不需要MSMQ,因为在客户端长时间不可用后我有自己的同步程序,我需要知道我是否可以中继短期消息传递。现在我知道了,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2015-08-17
    • 2021-08-03
    • 2020-04-15
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多