【问题标题】:How to handle unexpected error connection in WCF如何处理 WCF 中的意外错误连接
【发布时间】:2025-12-15 15:00:02
【问题描述】:

我有一个使用带有 net.tcp 绑定的 WCF 双工的聊天项目。我在 IIS 7.5 中构建

但我遇到了与在客户端实现的回调有关的问题。当客户端点击断开连接按钮时,它可以正常工作,但万一客户端由于断开网络,计算机关闭等原因而崩溃。之后,服务无法正常工作。服务似乎也出错了。

我的聊天服务界面:

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

    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = true)]
    void Disconnect();

    [OperationContract(IsInitiating = false)]
    void Refresh();

    [OperationContract(IsOneWay = true, IsInitiating = false)]
    void Whisper(string target, string content);

    [OperationContract(IsInitiating = false)]
    Room[] GetRooms();

    [OperationContract(IsInitiating = false)]
    bool CreateRoom(string roomName);

    [OperationContract(IsInitiating = false)]
    bool JoinRoom(string roomName);

    [OperationContract(IsOneWay = true, IsInitiating = false)]
    void LeaveRoom(string roomName);

    [OperationContract(IsOneWay = true, IsInitiating = false)]
    void SayToRoom(string roomName, string content);

    [OperationContract(IsOneWay = true, IsInitiating = false)]
    void InviteMember(Client client, string roomName);

    [OperationContract(IsOneWay = true, IsInitiating = false)]
    void KickMember(Client member, string roomName);

    [OperationContract(IsOneWay = true, IsInitiating = false)]
    void DisconnectRoom(string roomName);

    [OperationContract(IsOneWay = true, IsInitiating = false)]
    void DisconnectAllRoom();

    [OperationContract(IsOneWay = true, IsInitiating = false)]
    void SendFile(string target, File file);
}

我的服务回调:

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

    [OperationContract(IsOneWay = true)]
    void ReceiveWhisper(Message message);

    [OperationContract(IsOneWay = true)]
    void ReceiveRoomMessage(string roomName, Message message);

    [OperationContract(IsOneWay = true)]
    void ReceiveNotifyClientConnect(Client joinedClient);

    [OperationContract(IsOneWay = true)]
    void ReceiveNotifyClientDisconnect(Client leaver);

    [OperationContract(IsOneWay = true)]
    void ReceiveNotifyClientJoinRoom(Client joinedClient, string roomName);

    [OperationContract(IsOneWay = true)]
    void ReceiveNotifyClientLeaveRoom(Client leaver, string roomName, bool kicked);

    [OperationContract(IsOneWay = true)]
    void ReceiveNotifyClientDisconnectRoom(Client owner, string roomName);

    [OperationContract(IsOneWay = true)]
    void ReceiveInvitedMessage(Room room);

    [OperationContract(IsOneWay = true)]
    void ReceivedFile(File file);
}

如何处理这个意外错误?

【问题讨论】:

    标签: wcf


    【解决方案1】:

    查看this MSDN article 的双工服务。正如微软警告的那样:

    双工模型不会自动检测服务或客户端何时关闭其通道。 因此,如果服务意外终止,默认情况下不会通知服务,或者如果客户端意外终止,则不会通知服务。客户端和服务可以实现自己的协议来相互通知,如果他们如此选择。

    因此,每当您尝试将数据发送回客户端时,您都需要进行检查。永远不要假设每次传输时连接仍然是纯的,因为它可能已经在服务不知道的情况下失败了。

    【讨论】: