2011-12-07 27 views
0

我有使用WCF雙工與net.tcp綁定的聊天項目。我已經內置IIS 7.5如何處理WCF中的意外錯誤連接

但我有問題與客戶端實現的回調有關。當客戶端點擊斷開連接按鈕時,它可以正常工作,但是如果客戶端崩潰了一些重新連接,例如斷開網絡連接,計算機關閉等。之後,服務無法正常工作。看來服務也會出錯。

我聊天服務接口:

[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); 
} 

如何處理這個意外的錯誤?

回答

0

看看this MSDN article雙面服務。正如微軟所警告的:

當服務或客戶端關閉其通道時,雙工模式不會自動檢測到。 因此,如果服務意外終止,默認情況下服務將不會被通知,或者如果客戶端意外終止,服務將不會被通知。客戶和服務可以實現自己的協議,以便他們如此選擇時通知對方。

因此,只要您嘗試將數據發送回客戶端,您就需要執行檢查。切勿假設每次傳輸的連接仍然是純粹的,因爲如果服務尚未知曉,它可能已經失敗。