Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 双工连接。断开客户端连接时出错。C WCF_C#_.net_Wcf - Fatal编程技术网

C# 双工连接。断开客户端连接时出错。C WCF

C# 双工连接。断开客户端连接时出错。C WCF,c#,.net,wcf,C#,.net,Wcf,但我有一个和回调相关的问题,回调是在客户端实现的。当客户端点击“断开连接”按钮时,它工作正常,但万一客户端因断开网络连接、计算机关机等原因而崩溃,则服务无法正常工作。看来服务也会出错 [ServiceContract(CallbackContract = typeof(IChatCallback), SessionMode = SessionMode.Required)] public interface IChat { [OperationContract(IsInitiating =

但我有一个和回调相关的问题,回调是在客户端实现的。当客户端点击“断开连接”按钮时,它工作正常,但万一客户端因断开网络连接、计算机关机等原因而崩溃,则服务无法正常工作。看来服务也会出错

[ServiceContract(CallbackContract = typeof(IChatCallback), SessionMode = SessionMode.Required)]
public interface IChat
{
    [OperationContract(IsInitiating = true)]
    bool Connect(Client client);

    [OperationContract(IsOneWay = true)]
    void Say(Message msg);

    [OperationContract(IsOneWay = true)]
    void Whisper(Message msg, Client receiver);

    [OperationContract(IsOneWay = true)]
    void OperSelectClient(Client oper, string client, bool connect, bool isdisconnect);

    [OperationContract(IsOneWay = true)]
    void IsWriting(Client client);

    [OperationContract(IsOneWay = true, IsTerminating = true)]
    void Disconnect(Client client);

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

    [OperationContract(IsOneWay = true)]
    void RefreshClientsAndOperators(Client client);
}

public interface IChatCallback
{
    [OperationContract(IsOneWay = true)]
    void RefreshClients(List<Client> clients);

    [OperationContract(IsOneWay = true)]
    void Receive(Message msg);

    [OperationContract(IsOneWay = true)]
    void ReceiveWhisper(Message msg, Client receiver);

    [OperationContract(IsOneWay = true)]
    void ClientSelect(Client oper, string client);

    [OperationContract(IsOneWay = true)]
    void IsWritingCallback(Client client);

    [OperationContract(IsOneWay = true)]
    void UserJoin(Client client);

    [OperationContract(IsOneWay = true)]
    void UserLeave(Client client);
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
public class ChatService : IChat
{
    Dictionary<Client, IChatCallback> clients = new Dictionary<Client, IChatCallback>();

    List<Client> clientList = new List<Client>();

    public IChatCallback CurrentCallback
    {
        get
        {
            return OperationContext.Current.GetCallbackChannel<IChatCallback>();
        }
    }

    object syncObj = new object();

    public bool Connect(Client client)
    {
        if (SearchClientsByName(client.Name) && !clients.ContainsValue(CurrentCallback))
        {
            OperationContext.Current.Channel.Faulted += new EventHandler(delegate { Disconnect(client); });
            OperationContext.Current.Channel.Closed += new EventHandler(delegate { Disconnect(client); });

            lock (syncObj)
            {
                clients.Add(client, CurrentCallback);
                clientList.Add(client);

                foreach (Client key in clients.Keys)
                {
                    IChatCallback callback = clients[key];
                    try
                    {
                        callback.RefreshClients(clientList);
                        callback.UserJoin(client);
                    }
                    catch
                    {
                        clients.Remove(key);
                        return false;
                    }
                }
            }
}}

你有哪些具体的错误?有很多。我录了录像。请看一看。你有哪些具体的错误?有很多。我录了录像。请看一看。