【问题标题】:wcf callback timeout when sending more than one messages发送多条消息时的 wcf 回调超时
【发布时间】:2012-08-19 06:16:16
【问题描述】:

我有一个 wcf 回调程序,它可以向客户端发送消息。

如果我尝试发送第二条消息,整个程序会冻结并且我会收到超时异常。

这是服务器代码:

 public void SendMessageToClient(string computerName, string message)
    {
        foreach (var session in connectedClients.Values)
        {
            if (session.ComputerName == computerName)
            {
                var asyncResult = session.Callback.BeginOnMessageReceived(message, new AsyncCallback(OnPushMessageComplete), session.Callback);
                if (asyncResult.CompletedSynchronously)
                    CompletePushMessage(asyncResult);
            }
        }
    }
   void OnPushMessageComplete(IAsyncResult asyncResult)
    {
        CompletePushMessage(asyncResult);            
    }

    void CompletePushMessage(IAsyncResult asyncResult)
    {
        var callbackChannel = (IServiceCallback)asyncResult.AsyncState;
        try
        {
            callbackChannel.EndOnMessageReceived(asyncResult);
        }
        catch { }
    }

这是回调接口:

 [OperationContract(IsOneWay = true, AsyncPattern = true)]
    IAsyncResult BeginOnMessageReceived(string message, AsyncCallback acb, object state);
    void EndOnMessageReceived(IAsyncResult iar);

这是客户端代码:

[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)]
public class ServiceHandler : IServiceCallback
{
    public delegate void MessageReceivedHandler(string message);
    public event MessageReceivedHandler OnMessageReceivedEvent;

    public void OnMessageReceived(string message)
    {
        if (this.OnMessageReceivedEvent != null)
            this.OnMessageReceivedEvent(message);
    }
}    

void callback_OnMessageReceivedEvent(string message)
    {
       setlb_info(message)
    }
public void setlb_info(string wert)
    {
        if (this.lb_info.InvokeRequired)
        {
            setlb_infoCallback d = new setlb_infoCallback(setlb_info);
            this.Invoke(d, new object[] { wert });
        }
        else
        {
            this.lb_info.Text = wert;
        }

    }

如果我试试这个:

Service.CurrentInstance.SendMessageToClient(client_name, message);

客户端会收到消息,但如果我第二次调用相同的方法,我会收到 timeoutexception(设置为 1 分钟)。

我正在使用这个项目的代码(德语):

http://www.flexbit.at/blog/wcf-duplex-zwischen-windows-sevice-und-gui-frontend/

我希望有人可以帮助我,因为如果此功能不起作用,我将无法完成我的工作。

最好的问候

编辑:我忘记了客户端的代码:

 var callback = new ServiceHandler();
                callback.OnMessageReceivedEvent += new ServiceHandler.MessageReceivedHandler(callback_OnMessageReceivedEvent);
                var callbackInstanceContext = new InstanceContext(callback);
                client = new ServiceClient(callbackInstanceContext);
                client.Subscribe(System.Environment.MachineName);    

【问题讨论】:

    标签: wcf callback timeout


    【解决方案1】:

    尝试改变 [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.可重入, UseSynchronizationContext = false)] 到 [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]

    【讨论】:

    • 1.还没有。它只是向客户端发送一条消息。 2. 调用异常需要一分钟。如果我在两种不同的方法中使用 sendMessageToClient() 函数,它工作得很好,但如果我一个接一个地写它们(sendMessageToClient(client, message1); sendMessageToClient(client,message2); 我得到超时
    • 如果更改为 [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)] 会发生什么
    • Yoztastic 你解决了我的问题!!对我感到羞耻,我从未尝试过。Multiple :D 谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    相关资源
    最近更新 更多